spring 两个数据源 怎么配事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 两个数据源 怎么配事务相关的知识,希望对你有一定的参考价值。

使用JTA事务,jboss,weblogic,websphere 等等ejb容器都自带了jta事务的支持,如果你使用tomcat,jetty或者其他web容器,则需要安装第三方的jta插件,假定这里使用jboss容器,则需要在jboss中配置JNDI数据源,比如有两个mysql的数据源需要被JTA管理,则需要在jboss的server/default/deploy目录下新建两个数据源文件app1-ds.xml和app2-ds.xml,这里只拿一个文件做例子,内容如下所示:
<datasources>
<xa-datasource>
<jndi-name>MySqlDS1</jndi-name>
<xa-datasource-class>
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
</xa-datasource-class>
<xa-datasource-property name="URL">
jdbc:mysql://localhost:3306/test
</xa-datasource-property>
<user-name>root</user-name>
<password>root</password>
<use-java-context>false</use-java-context>
<track-connection-by-tx>true</track-connection-by-tx>
<exception-sorter-class-name>
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</xa-datasource>
</datasources>
完成JNDI数据源配置后,需要在spring中获取JNDI数据源,配置如下:
<bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="MySqlDS1" />
<property name="lookupOnStartup" value="true" />
</bean>
<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="MySqlDS2" />
<property name="lookupOnStartup" value="true" />
</bean>
然后定义JTA事务如下:
<bean id="transactionManager-xa"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager" />
</bean>

通过声明式事务模板(代理),指定目标类的特定方法采用JTA事务:
<bean
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property >
<ref bean="transactionManager-xa" />
</property>
<property >
<ref local="accountsInfoDAO" /> <!-- 目标类 -->
</property>
<property >
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
追问
<transactionManager type ="JTA">
<property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
<dataSource type="JNDI" >
<property name ="DataSource" value="java:comp/env/jdbc/myDataSource"/>
</ dataSource >在配置sql-map-config.xml 中如果有两个数据源那么着 DataSource 是不是应该配置两个,如果是 两个名字一样,如果不是那么应该怎么来配置这个。UserTransaction的value指的什么?
回答
是应该配置两个,但是为什么要配置两个数据源名字一样呢?既然是两个不同的数据库,数据源名字怎么可能一样。

java:/ctx/con/UserTransaction 是指spring访问EJB容器的资源,即容器拥有的JTA事务的API,是特定的接口,可以理解为JTA事务的驱动,不同的容器所拥有的API是不一样的,如下所示:

JBoss: "java:/ctx/con/UserTransaction"
WebLogic: "javax.transaction.UserTransaction"
WebSphere: "java:comp/UserTransaction"
追问
在我启动的时候出现了
Error initializing JtaTransactionConfig while looking up UserTransaction (java:/ctx/con/UserTransaction). Cause: javax.naming.NameNotFoundException: ctx not bound
请问下,这个空间命名,需要我自己添加 还是jboss中就有了这样的空间命名。如果没有 应在怎样添加这个文件
回答
将jboss\docs\examples\jca下的mysql-ds.xml拷贝到jboss\server\default\deploy下,并做相应修改,主要内容如下:
<datasources>
<local-tx-datasource>
<jndi-name>UserTransaction</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/abcdef</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-
sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
参考技术A 第一步、测试能否配置多个DataSource
第二步、测试能否配置多个SessionFactory
第三步、测试能否配置多个TransactionManager
第四步、测试能否使用多个TransactionManager,也就是看能否配置多个<tx:annotation-driven/>
第五步、测试能否配置JTATransactionManager
第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager

以上是关于spring 两个数据源 怎么配事务的主要内容,如果未能解决你的问题,请参考以下文章

Spring怎么在一个事务中开启另一个事务

Spring嵌套事务是怎么回滚的?

涨知识了!Spring 怎么在一个事务中开启另一个事务

spring事务内如何查询别的数据源

spring怎么进行的事务管理,求指导?

多数据源 spring怎么管理事务的