【发布时间】:2019-09-02 13:25:39
【问题描述】:
我为 2 个数据库设置了实体和存储库
persistence.xml
<persistence-unit name="user_per_unit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.User</class>
<class>com.example.Order</class>
<class>com.example.Package</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.jdbc.batch_size" value="100" />
<property name="hibernate.order_inserts" value="true" />
<property name="hibernate.order_updates" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
<persistence-unit name="stock_per_unit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.Stock</class>
<class>com.example.Graph</class>
<class>com.example.Change</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.jdbc.batch_size" value="100" />
<property name="hibernate.order_inserts" value="true" />
<property name="hibernate.order_updates" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
在applicationContext.xml
<jpa:repositories base-package="com.example.user.repository" entity-manager-factory-ref="userEntityManagerFactory" transaction-manager-ref="userTransactionManager"/>
<bean id="userEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="user_per_unit" />
<property name="dataSource" ref="userDataSource" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean>
<bean id="userTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="userEntityManagerFactory" />
</bean>
<bean id="userDataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="initialSize" value="${size}" />
<property name="maxTotal" value="${maxtotal}" />
<property name="maxIdle" value="${maxidle}" />
<property name="minIdle" value="${minidle}" />
</bean>
<jpa:repositories base-package="com.example.stock.repository" entity-manager-factory-ref="stockEntityManagerFactory" transaction-manager-ref="stockTransactionManager"/>
<bean id="stockEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="stock_per_unit" />
<property name="dataSource" ref="stockDataSource" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean>
<bean id="stockTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="stockEntityManagerFactory" />
</bean>
<bean id="stockDataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="initialSize" value="${size}" />
<property name="maxTotal" value="${maxtotal}" />
<property name="maxIdle" value="${maxidle}" />
<property name="minIdle" value="${minidle}" />
</bean>
现在在我的课堂上,我正在使用类似的方法进行几个 CURD 操作
userRepository.updateUser(...);
userRepository.addUser(...);
userRepository.deleteUser(...);
stockRepository.updateUser(...);
stockRepository.addUser(...);
stockRepository.deleteUser(...);
如何在顶部开始事务,如果过程中出现问题,在我开始我的方法之前恢复到原始状态。
【问题讨论】:
-
您的 JDBC 驱动程序是否兼容 XA?如果是这样,您将需要启用 JTA 事务管理器而不是简单的。一旦你这样做了,你也需要期待更慢的交易。
-
@TheImpaler 我不知道 JDBC 驱动程序是否兼容 XA
-
您需要与供应商核实。如果它们不符合 XA,那么您将无法拥有包含两个数据库的 single 事务。本质上,您需要启用两阶段提交。
-
@TheImpaler 我可以访问 mysql 管理员,有没有办法检查它是否合规?
-
我使用的一种“非正式”方式是使用
Connection.getDatabaseMetaData()获取 JDBC 驱动程序版本字符串,然后在 MySQL 网站中查找它。但是,我会正式要求运营团队确保这在时机成熟时能够在生产中发挥作用。
标签: java mysql database hibernate spring-data-jpa