Весна. Несколько источников данных с одним блоком сохраняемости

Можно ли весной использовать один и тот же блок сохранения с несколькими источниками данных?

Например. У меня есть две базы данных. Они на другом сервере. Один только для записи (вставка, обновление, удаление и т. д.), а другой только для чтения. Оба они используют одну и ту же структуру. Итак, могу ли я использовать одну единицу персистентности для них обоих?

Я нашел этот ReplicationDriver который решает мою проблему. Я просто определяю свои главный и подчиненный серверы, а на стороне кода я просто определяю @Transaction(readOnly=true). Поэтому, когда транзакция readOnly=true, менеджер использует мой ведомый, а в других случаях использует мой главный в соответствии с connector/j. документация. Теперь при использовании этого кота невозможно подключиться к моей базе данных. Я имею в виду, просто подождите, ничего не произойдет. Это мой apache tomcat context.xml

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <Resource 
        auth="Container" 
        driverClassName="com.mysql.jdbc.ReplicationDriver" 
        maxActive="250" 
        maxIdle="100"
        maxWait="30"
        validationQuery="select 1"
        name="mysql/test" 
        type="javax.sql.DataSource" 
        url="jdbc:mysql:replication://address=(host=master)(user=root)(password=mroot),address=(host=slave)(user=root)(password=sroot)/test?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF8&amp;failOverReadOnly=false&amp;maxReconnects=10" 
    />
</Context>

А это мой весенний context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <tx:annotation-driven/>

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"/>

    <jee:jndi-lookup id="dataSource" jndi-name="mysql/test" expected-type="javax.sql.DataSource" />

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="test_pu" />
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>

В чем моя ошибка? почему tomcat не может подключиться к db? Кстати, используйте провайдера eclipslink v2.4.0

ОБНОВИТЬ

Я не знаю почему, но когда я использую jdbc:mysql://address в этом формате, моя программа не может подключиться к БД и выдает следующее исключение

Caused by: java.lang.NullPointerException
    at com.mysql.jdbc.NonRegisteringDriver.parseHostPortPair(NonRegisteringDriver.java:204)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2235)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284).

Но при использовании формата jdbc:mysql://host1,host2 соединение успешно. Если мы используем вторую версию, я должен использовать одно и то же имя пользователя и пароль для каждого соединения, но в первой версии мы можем определить другое имя пользователя и пароль. Согласно документации MySQL Connector J

Ниже приведен альтернативный формат URL-адресов JDBC для подключения к серверу MySQL, который является обязательным для соединений IPv6, но также может использоваться с IPv4 (элементы в квадратных скобках ([]) являются необязательными):

jdbc:mysql://адрес=(ключ1=значение)[(ключ2=значение)]...[,адрес=(ключ3=значение)[(ключ4=значение)]...]...[/[база данных ]]» [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

Это означает, что это работает и с IP4, но не работает. Есть ли что-то, что мне не хватает в моей конфигурации?


person sakit    schedule 22.11.2016    source источник
comment
Как это будет работать и что хорошего? Вы говорите о мастер БД и репликах чтения?   -  person Kayaman    schedule 22.11.2016
comment
@каяман да. Я говорю о главном сервере БД и репликации.   -  person sakit    schedule 22.11.2016
comment
Связанный stackoverflow.com/questions/25911359/   -  person Kayaman    schedule 22.11.2016
comment
codingpedia.org/ama /   -  person Zia    schedule 22.11.2016
comment
@Zia Это описывает несколько единиц сохранения с несколькими источниками данных.   -  person Kayaman    schedule 22.11.2016
comment
@Zia спасибо, но я прочитал этот пост, о котором вы упомянули. В этом посте объясняются две разные единицы персистентности. Он создает два менеджера сущностей с двумя разными единицами персистентности. мой вопрос касается использования одного и того же модуля сохранения с двумя разными менеджерами сущностей. См. ссылку Каямана. Это не ответ на мой вопрос, но цель та же   -  person sakit    schedule 22.11.2016


Ответы (1)


Насколько мне известно, это невозможно. Подробную информацию см. по ссылке ниже: the-same-data">Объяснил, почему нет

person mayank agrawal    schedule 22.11.2016