spring 两个数据源 怎么配事务

 我来答
那时虾米
推荐于2016-08-23 · TA获得超过4.4万个赞
知道大有可为答主
回答量:5054
采纳率:0%
帮助的人:3359万
展开全部
使用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>
百度网友96ffcf7
推荐于2016-11-26 · 知道合伙人互联网行家
百度网友96ffcf7
知道合伙人互联网行家
采纳数:22721 获赞数:118720
从事多年网络方面工作,有丰富的互联网经验。

向TA提问 私信TA
展开全部
第一步、测试能否配置多个DataSource
第二步、测试能否配置多个SessionFactory
第三步、测试能否配置多个TransactionManager
第四步、测试能否使用多个TransactionManager,也就是看能否配置多个<tx:annotation-driven/>
第五步、测试能否配置JTATransactionManager
第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式