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>
- <property name="testQuery" value="SELECT 1 from dual"/> <!--解决偶尔失去连接的bug-->
- </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>
- 接下来的代码和上例类同就不再写。
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)的更多相关文章
- DTP模型之二:(XA协议之二)JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)
jotm只能用的xapool数据源,而且很少更新. 一.以下介绍Spring中直接集成JOTM提供JTA事务管理.将JOTM集成到Tomcat中. (经过测试JOTM在批量持久化时有BUG需要修改源码 ...
- Spring+JTA+Atomikos+mybatis分布式事务管理
我们平时的工作中用到的Spring事务管理是管理一个数据源的.但是如果对多个数据源进行事务管理该怎么办呢?我们可以用JTA和Atomikos结合Spring来实现一个分布式事务管理的功能.了解JTA可 ...
- 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)
本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...
- 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理
原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...
- spring整合atomikos实现分布式事务
前言 Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到 ...
- spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务
文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...
- DTP模型之二:(XA协议之二)jotm分布式事务实现
分布式事务是指操作多个数据库之间的事务,spring的org.springframework.transaction.jta.JtaTransactionManager,提供了分布式事务支持.如果使用 ...
- SpringMVC+MyBatis+JMS+JTA(分布式事务)
SpringMVC+MyBatis 相信已经是如今企业开发中经常使用技术了. 由于一些需求,我们须要集成JMS(我使用的是ActiveMQ).大家应该都知道.MQ也能够觉得是一个数据源.数据也是数据源 ...
随机推荐
- 【CodeForces 312B】BUPT 2015 newbie practice #3A Archer
题 SmallR is an archer. SmallR is taking a match of archer with Zanoes. They try to shoot in the targ ...
- 【LeetCode】Sum of Two Integers
问题描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and - ...
- CSS设置技巧
一.单位和值 1.1 颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令 ...
- 一个项目中哪些文件是要上传到 git上的,哪些是不必要的
- BZOJ3626 LCA
Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. ...
- 洛谷P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1136 迎接仪式
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
- POJ2263 Heavy Cargo
Heavy Cargo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4004 Accepted: 2124 Descr ...
- 无线安全: 通过伪AP进行DHCP+DNS劫持的钓鱼攻击
有了之前学习802.11的数据帧格式.芯片硬件参数学习的基础后,我们接下来继续学习无线安全中黑客是怎样进行流量劫持攻击的 相关学习资料 http://www.freebuf.com/articles/ ...
- JAVA-封装
1.什么是封装? 顾名思义,封装就是装起来,圈起来的意思,用于类与对象中来讲,就是在一个类中把对象拥有的属性和隐藏信息(条件)进行封装,不允许外部程序直接访问,而必须要通过该类提供的方法来实现对隐藏信 ...