Java 在Spring中为不同的数据源设置事务的正确方法?
我有一个需要连接到多个数据库的应用程序。这是一个管理应用程序,基本上用于管理不同数据库中的条目-我们不需要同时访问多个数据库,也不需要任何类型的分布式事务管理 基本上,应用程序的一个区域允许您在数据库A中创建小工具,另一个区域允许您在数据库B中配置类似的小工具 当只使用一个数据源时,我们已经设置了事务,并且可以完美地工作。配置如下所示:Java 在Spring中为不同的数据源设置事务的正确方法?,java,spring,transactions,Java,Spring,Transactions,我有一个需要连接到多个数据库的应用程序。这是一个管理应用程序,基本上用于管理不同数据库中的条目-我们不需要同时访问多个数据库,也不需要任何类型的分布式事务管理 基本上,应用程序的一个区域允许您在数据库A中创建小工具,另一个区域允许您在数据库B中配置类似的小工具 当只使用一个数据源时,我们已经设置了事务,并且可以完美地工作。配置如下所示: <aop:config> <aop:pointcut id="companyServicePoint" expr
<aop:config>
<aop:pointcut id="companyServicePoint"
expression="execution(* com.company.service.CompanyService.*(..))" />
<aop:advisor advice-ref="companyServiceTxAdvice"
pointcut-ref="companyServicePoint"/>
</aop:config>
<tx:advice id="companyServiceTxAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- set propogation required on create methods, all others are read-only -->
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
这似乎会导致后续问题,因为CompanyService
实例中的任何一个都只使用单个数据源
有没有更好的方法来配置我想要完成的任务?您是否尝试过使用JtaTransactionManager
是的,您需要一份重复的交易通知。请注意,在下面的配置中,切入点表达式选择了一个特定的CompanyService bean
<bean id="companyService1" class="com.company.service.CompanyServiceImpl">
<property name="companyDao">
<bean class="com.company.service.CompanyDAO">
<property name="dataSource" ref="dataSource1"/>
</bean>
</property>
</bean>
<aop:config>
<aop:pointcut
id="companyServicePoint1"
expression="bean(companyService1)"/>
<aop:advisor
advice-ref="companyServiceTxAdvice1"
pointcut-ref="companyServicePoint1"/>
</aop:config>
<tx:advice id="companyServiceTxAdvice1" transaction-manager="txManager1">
<tx:attributes>
<!-- set propogation required on create methods, all others are read-only -->
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<bean
id="txManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1"/>
</bean>
谢谢,这工作得很好-当调用任何一个bean实例时,只创建一个事务。不像在接口上声明切入点那样优雅的解决方案,但这正是我的用例所要求的。。。
<bean id="companyService1" class="com.company.service.CompanyServiceImpl">
<property name="companyDao">
<bean class="com.company.service.CompanyDAO">
<property name="dataSource" ref="dataSource1"/>
</bean>
</property>
</bean>
<aop:config>
<aop:pointcut
id="companyServicePoint1"
expression="bean(companyService1)"/>
<aop:advisor
advice-ref="companyServiceTxAdvice1"
pointcut-ref="companyServicePoint1"/>
</aop:config>
<tx:advice id="companyServiceTxAdvice1" transaction-manager="txManager1">
<tx:attributes>
<!-- set propogation required on create methods, all others are read-only -->
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<bean
id="txManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1"/>
</bean>
<bean
id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="companyService1" parent="baseTransactionProxy">
<property name="transactionManager" ref="txManager1"/>
<property name="target">
<bean class="com.company.service.CompanyServiceImpl">
<property name="companyDao">
<bean class="com.company.service.CompanyDAO">
<property name="dataSource" ref="dataSource1"/>
</bean>
</property>
</bean>
</property>
</bean>
<bean
id="txManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1"/>
</bean>