JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

【转自:http://www.cnblogs.com/huangjingzhou/articles/2012014.html

JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

一.以下介绍Spring中直接集成JOTM提供JTA事务管理、将JOTM集成到Tomcat中。
(经过测试JOTM在批量持久化时有BUG需要修改源码GenericPool类解决)!
参考文章http://mavin.zhou.blog.163.com/blog/static/114522435200971822334475/
通过集成JOTM,直接在Spring中使用JTA事务
JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。
Spring 2.0附带的依赖类库中虽然包含jotm类库,但是并不完整,你可以到http://jotm.objectweb.org下载完全版的JOTM。
Spring为JOTM提供了一个org.springframework.transaction.jta.JotmFactoryBean支持类,通过该支持类可以方便地创建JOTM本地实例。
1.将jotm的jar包lib目录下所有jar复制到项目中
2.将jotm的jar包conf目录下carol.properties文件复制到项目类路径下,修改内容为:

    
    
# do not use CAROL JNDI wrapper carol.start.jndi = false # do not start a name server carol.start.ns = false # Naming Factory carol.jndi.java.naming.factory.url.pkgs = org.apache.naming

3.建立两个数据库,配置两个数据源

    
    
<!-- XAPool配置,内部包含了一个XA数据源,对应相应的数据库 --> < bean id ="mysqlJta" class ="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method ="shutdown" > <!-- 内部XA数据源 --> < property name ="dataSource" > < bean class ="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method ="shutdown" > < property name ="transactionManager" ref ="jotm" /> < property name ="driverName" value ="com.mysql.jdbc.Driver" /> < property name ="url" value ="jdbc:MySQL://localhost:3309/test" /> < property name ="user" value ="root" /> < property name ="password" value ="" /> </ bean > </ property > < property name ="user" value ="root" /> < property name ="password" value ="" /> </ bean > < bean id ="oracleJta" class ="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method ="shutdown" > < property name ="dataSource" > < bean class ="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method ="shutdown" > < property name ="transactionManager" ref ="jotm" /> < property name ="driverName" value ="oracle.jdbc.driver.OracleDriver" /> < property name ="url" value ="jdbc:oracle:thin:@localhost:1521:orcl" /> < property name ="user" value ="orcl" /> < property name ="password" value ="" /> </ bean > </ property > < property name ="user" value ="orcl" /> < property name ="password" value ="" /> </ bean >

4.事务配置

    
    
<!-- JOTM本地实例 --> < bean id ="jotm" class ="org.springframework.transaction.jta.JotmFactoryBean" /> <!-- JTA事务管理器 --> < bean id ="txManager" class ="org.springframework.transaction.jta.JtaTransactionManager" > < property name ="userTransaction" ref ="jotm" /> </ bean > <!-- JTA事务传播特性 --> < tx:advice id ="txAdviceJta" transaction-manager ="txManager" > < tx:attributes > < tx:method name ="Jta*" isolation ="DEFAULT" propagation ="REQUIRED" rollback-for ="Exception" /> < tx:method name ="*" read-only ="true" /> </ tx:attributes > </ tx:advice > < aop:config > < aop:advisor pointcut ="execution(* com.xxxxl.service.impl..*(..))" advice-ref ="txAdviceJta" /> </ aop:config > < bean id ="timerDaoMysql" class ="com.xxxxl.TimerDaoImpl" scope ="prototype" > < property name ="dataSource" ref ="mysqlJta" ></ property > </ bean > < bean id ="timerDaoOracle" class ="com.xxxxl.TimerDaoImpl" scope ="prototype" > < property name ="dataSource" ref ="oracleJta" ></ property > </ bean >

二.以下介绍Spring中直接集成Atomikos提供JTA事务管理、将Atomikos集成到Tomcat中。(经过测试推荐此方法)
Atomikos Transactions Essentials现在的版本是3.1.7,可以在http://www.atomikos.com/Main/TransactionsEssentialsDownloadForm 下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。1.将Atomikos的jar包dist目录下所有jar复制到项目中
2.建立两个数据库,配置两个数据源。
Atomikos数据源配置方法有三种分别有:SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean可任选一种

    
    
Simple表示基础数据库连接配置 < bean id ="oracleJta" class ="com.atomikos.jdbc.SimpleDataSourceBean" init-method ="init" destroy-method ="close" > < property name ="uniqueResourceName" > < value > OracleXADataSource </ value > <!-- 任意命名,但必须唯一 --> </ property > < property name ="xaDataSourceClassName" > < value > oracle.jdbc.xa.client.OracleXADataSource </ value > </ property > < property name ="xaDataSourceProperties" > < value > URL=jdbc:oracle:thin:@localhost:1521:orcl;user=orcl;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 > Atomikos表示必须要用到XA数据库驱动类,可设置连接池(经过测试推荐此方法) < bean id ="oracleJta" class ="com.atomikos.jdbc.AtomikosDataSourceBean" init-method ="init" destroy-method ="close" lazy-init ="true" > < property name ="uniqueResourceName" > < value > OracleXADataSource </ value > </ property > < property name ="xaDataSourceClassName" > < value > oracle.jdbc.xa.client.OracleXADataSource </ value > </ property > < property name ="xaProperties" > < props > < prop key ="URL" > jdbc:oracle:thin:@localhost:1521:orcl </ prop > < prop key ="user" > orcl </ prop > < prop key ="password" ></ prop > </ props > </ property > < property name ="poolSize" >< value > 1 </ value ></ property > < property name ="maxPoolSize" >< value > 30 </ value ></ property > </ bean > AtomikosNon表示必须要用到普通数据库驱动类,可设置连接池 < bean id ="oracleJta" class ="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" > < property name ="uniqueResourceName" >< value > OracleXADataSource </ value ></ property > < property name ="user" >< value > orcl </ value ></ property > < property name ="password" >< value ></ value ></ property > < property name ="url" >< value > jdbc:oracle:thin:@192.168.1.217:1521:orcl </ value ></ property > < property name ="driverClassName" >< value > oracle.jdbc.OracleDriver </ value ></ property > < property name ="poolSize" >< value > 1 </ value ></ property > < property name ="borrowConnectionTimeout" >< value > 60 </ value ></ property > </ bean > 另外一个数据库在这就不在写了,设置同上只是mysql的驱动类名为:xaDataSourceClassName:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource

3.事务配置

    
    
Atomikos事务方法 < bean id ="atomikosTransactionManager" class ="com.atomikos.icatch.jta.UserTransactionManager" init-method ="init" destroy-method ="close" > < property name ="forceShutdown" > < value > true </ value > </ property > </ bean > < bean id ="atomikosUserTransaction" class ="com.atomikos.icatch.jta.UserTransactionImp" > < property name ="transactionTimeout" value ="240" /> </ bean > < bean id ="transactionManager" class ="org.springframework.transaction.jta.JtaTransactionManager" > < property name ="transactionManager" > < ref bean ="atomikosTransactionManager" /> </ property > < property name ="userTransaction" > < ref bean ="atomikosUserTransaction" /> </ property > </ bean > 接下来的代码和上例类同就不再写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值