使用Atomikos Transactions Essentials实现多数据源JTA分布式事务--转载
2015-03-20 11:37
489 查看
原文:http://www.ite/topic/122700
9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XADatasource支持,如果使用了支持XADatasouce版本,可以参考2楼补充.
最近做的project中遇到要将数据库中的表分布到两台不同的服务器上的Mysql5.0中,project主要使用spring+ibatis。因此需要JTA的支持,但是tomcat不支持,所以就搜索开源的JTA实现。
最开始使用的是JOTM,但是使用中不能自动rollback,无论什么情况都commit。然后看到infoq上一篇文章提到Atomikos Transactions Essentials,Atomikos Transactions Essentials 3.0是Atomikos 开发的核心事务引擎,支持JDBC 以及JMS 的JTA/XA 事务。易于部署,轻量级,同时支持JDBC 以及JMS 。
Atomikos Transactions Essentials现在的版本是3.1.7,可以在http://www.atomikos.com/Main/TransactionsEssentialsDownloadForm 下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。先将发布包里面dist目录下的atomikos-util.jar,transactions.jar,transactions-api.jar,transactions-jta.jar copy到项目lib里面, 如果使用hibernate则需要将另外两个hibernate相关的jar页copy到项目里面,spring配置文件如下:
xml 代码
<!-- 第一个数据库 -->
< bean id = "dataSource" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
< property name = "uniqueResourceName" >
< value > mysql/main </ value >
</ property >
< property name = "xaDataSourceClassName" >
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
< value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </ value >
</ property >
< property name = "xaDataSourceProperties" >
< value > URL =${jdbc.url}; user =${jdbc.username}; password =${jdbc.password} </ value >
</ property >
< property name = "exclusiveConnectionMode" >
< value > true </ value >
</ property >
< property name = "connectionPoolSize" >
< value > 3 </ value >
</ property >
< property name = "validatingQuery" >
< value > SELECT 1 </ value >
</ property >
</ bean >
<!-- 第二个数据库 -->
< bean id = "dataSourceB" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
< property name = "uniqueResourceName" >
< value > mysql/news </ value >
</ property >
< property name = "xaDataSourceClassName" >
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
< value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </ value >
</ property >
< property name = "xaDataSourceProperties" >
< value > URL =${jdbc.url.b}; user =${jdbc.username.b}; password =${jdbc.password.b} </ value >
</ property >
< property name = "exclusiveConnectionMode" >
< value > true </ value >
</ property >
< property name = "connectionPoolSize" >
< value > 3 </ value >
</ property >
< property name = "validatingQuery" >
< value > SELECT 1 </ value >
</ property >
</ bean >
< bean id = "lobHandler" class = "org.springframework.jdbc.support.lob.DefaultLobHandler" />
<!-- 第一个数据库的sqlMapClient -->
< bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
< property name = "configLocation" >
<!-- 包含第一个数据库表的map -->
< value > classpath:/sqlmap-config.xml </ value >
</ property >
< property name = "dataSource" ref = "dataSource" />
< property name = "lobHandler" ref = "lobHandler" />
</ bean >
<!-- 第二个数据库的sqlMapClient -->
< bean id = "sqlMapClientB" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
< property name = "configLocation" >
<!-- 包含第一个数据库表的map -->
< value > classpath:/sqlmap-configb.xml </ value >
</ property >
< property name = "dataSource" ref = "dataSourceB" />
< property name = "lobHandler" ref = "lobHandler" />
</ bean >
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
< bean id = "atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method = "init"
destroy-method = "close" >
<!-- when close is called, should we force transactions to terminate or not? -->
< property name = "forceShutdown" >
< value > true </ value >
</ property >
</ bean >
<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
< bean id = "atomikosUserTransaction" class = "com.atomikos.icatch.jta.UserTransactionImp" >
< property name = "transactionTimeout" value = "240" />
</ bean >
<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
< bean id = "transactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" >
< property name = "transactionManager" >
< ref bean = "atomikosTransactionManager" />
</ property >
< property name = "userTransaction" >
< ref bean = "atomikosUserTransaction" />
</ property >
</ bean >
事务的配置, 使用了spring2.0的语法,所以将namesapce也帖出来了.
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:aop = "http://www.springframework.org/schema/aop"
xmlns:tx = "http://www.springframework.org/schema/tx"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire = "byName" default-lazy-init = "true" >
<!-- 支持 @AspectJ 标记-->
< aop:aspectj-autoproxy />
< aop:config proxy-target-class = "true" >
< aop:advisor pointcut = "execution(* *Facade.*(..))" advice-ref = "txAdvice" />
< aop:advisor pointcut = "execution(* *Manager.*(..))" advice-ref = "txAdvice" />
</ aop:config >
< tx:advice id = "txAdvice" >
< tx:attributes >
< tx:method name = "get*" read-only = "true" />
< tx:method name = "find*" read-only = "true" />
< tx:method name = "has*" read-only = "true" />
< tx:method name = "locate*" read-only = "true" />
< tx:method name = "*" />
</ tx:attributes >
</ tx:advice >
</ beans >
这样配置以后就可以使用分布式事务,测试中出现异常时事务也自动提交。和JOTM相比Atomikos Transactions Essentials更加稳定,它原来是商业项目,现在开源了。象mysql一样卖服务支持的。而且论坛页比较活跃,有问题很快可以解决。
9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XADatasource支持,如果使用了支持XADatasouce版本,可以参考2楼补充.
最近做的project中遇到要将数据库中的表分布到两台不同的服务器上的Mysql5.0中,project主要使用spring+ibatis。因此需要JTA的支持,但是tomcat不支持,所以就搜索开源的JTA实现。
最开始使用的是JOTM,但是使用中不能自动rollback,无论什么情况都commit。然后看到infoq上一篇文章提到Atomikos Transactions Essentials,Atomikos Transactions Essentials 3.0是Atomikos 开发的核心事务引擎,支持JDBC 以及JMS 的JTA/XA 事务。易于部署,轻量级,同时支持JDBC 以及JMS 。
Atomikos Transactions Essentials现在的版本是3.1.7,可以在http://www.atomikos.com/Main/TransactionsEssentialsDownloadForm 下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。先将发布包里面dist目录下的atomikos-util.jar,transactions.jar,transactions-api.jar,transactions-jta.jar copy到项目lib里面, 如果使用hibernate则需要将另外两个hibernate相关的jar页copy到项目里面,spring配置文件如下:
xml 代码
<!-- 第一个数据库 -->
< bean id = "dataSource" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
< property name = "uniqueResourceName" >
< value > mysql/main </ value >
</ property >
< property name = "xaDataSourceClassName" >
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
< value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </ value >
</ property >
< property name = "xaDataSourceProperties" >
< value > URL =${jdbc.url}; user =${jdbc.username}; password =${jdbc.password} </ value >
</ property >
< property name = "exclusiveConnectionMode" >
< value > true </ value >
</ property >
< property name = "connectionPoolSize" >
< value > 3 </ value >
</ property >
< property name = "validatingQuery" >
< value > SELECT 1 </ value >
</ property >
</ bean >
<!-- 第二个数据库 -->
< bean id = "dataSourceB" class = "com.atomikos.jdbc.SimpleDataSourceBean" init-method = "init" destroy-method = "close" >
< property name = "uniqueResourceName" >
< value > mysql/news </ value >
</ property >
< property name = "xaDataSourceClassName" >
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
< value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </ value >
</ property >
< property name = "xaDataSourceProperties" >
< value > URL =${jdbc.url.b}; user =${jdbc.username.b}; password =${jdbc.password.b} </ value >
</ property >
< property name = "exclusiveConnectionMode" >
< value > true </ value >
</ property >
< property name = "connectionPoolSize" >
< value > 3 </ value >
</ property >
< property name = "validatingQuery" >
< value > SELECT 1 </ value >
</ property >
</ bean >
< bean id = "lobHandler" class = "org.springframework.jdbc.support.lob.DefaultLobHandler" />
<!-- 第一个数据库的sqlMapClient -->
< bean id = "sqlMapClient" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
< property name = "configLocation" >
<!-- 包含第一个数据库表的map -->
< value > classpath:/sqlmap-config.xml </ value >
</ property >
< property name = "dataSource" ref = "dataSource" />
< property name = "lobHandler" ref = "lobHandler" />
</ bean >
<!-- 第二个数据库的sqlMapClient -->
< bean id = "sqlMapClientB" class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
< property name = "configLocation" >
<!-- 包含第一个数据库表的map -->
< value > classpath:/sqlmap-configb.xml </ value >
</ property >
< property name = "dataSource" ref = "dataSourceB" />
< property name = "lobHandler" ref = "lobHandler" />
</ bean >
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
< bean id = "atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method = "init"
destroy-method = "close" >
<!-- when close is called, should we force transactions to terminate or not? -->
< property name = "forceShutdown" >
< value > true </ value >
</ property >
</ bean >
<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
< bean id = "atomikosUserTransaction" class = "com.atomikos.icatch.jta.UserTransactionImp" >
< property name = "transactionTimeout" value = "240" />
</ bean >
<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
< bean id = "transactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" >
< property name = "transactionManager" >
< ref bean = "atomikosTransactionManager" />
</ property >
< property name = "userTransaction" >
< ref bean = "atomikosUserTransaction" />
</ property >
</ bean >
事务的配置, 使用了spring2.0的语法,所以将namesapce也帖出来了.
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:aop = "http://www.springframework.org/schema/aop"
xmlns:tx = "http://www.springframework.org/schema/tx"
xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire = "byName" default-lazy-init = "true" >
<!-- 支持 @AspectJ 标记-->
< aop:aspectj-autoproxy />
< aop:config proxy-target-class = "true" >
< aop:advisor pointcut = "execution(* *Facade.*(..))" advice-ref = "txAdvice" />
< aop:advisor pointcut = "execution(* *Manager.*(..))" advice-ref = "txAdvice" />
</ aop:config >
< tx:advice id = "txAdvice" >
< tx:attributes >
< tx:method name = "get*" read-only = "true" />
< tx:method name = "find*" read-only = "true" />
< tx:method name = "has*" read-only = "true" />
< tx:method name = "locate*" read-only = "true" />
< tx:method name = "*" />
</ tx:attributes >
</ tx:advice >
</ beans >
这样配置以后就可以使用分布式事务,测试中出现异常时事务也自动提交。和JOTM相比Atomikos Transactions Essentials更加稳定,它原来是商业项目,现在开源了。象mysql一样卖服务支持的。而且论坛页比较活跃,有问题很快可以解决。
相关文章推荐
- 使用Atomikos Transactions Essentials实现多数据源JTA分布式事务
- 使用Atomikos Transactions Essentials实现多数据源JTA分布式事务
- 使用Atomikos Transactions Essentials实现多数据源JTA分布式事务
- [转载]使用消息队列实现分布式事务-公认较为理想的分布式事务解决方案
- Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis
- 使用JOTM实现分布式事务管理(多数据源)
- Postgresql 分布式事务JTA实现Atomikos与Spring集成实践
- 使用JOTM实现分布式事务管理(多数据源)
- [置顶] 【分布式事务】使用atomikos+jta解决分布式事务问题
- spring项目加入jta分布式事务的实现方式: Atomikos
- 使用JOTM实现分布式事务管理(多数据源)
- Spring+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务
- 使用JOTM实现分布式事务管理(多数据源)
- 使用JOTM实现分布式事务管理(多数据源)
- Spring3.0+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务
- 分布式事务JTA实现之:SSM+ATOMIKOS
- Springboot+atomikos+jta实现分布式事务统一管理
- Spring3.0+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务
- Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis
- 使用JOTM实现分布式事务管理(多数据源)