Spring3 JOTM实现分布式事务
1. 创建web工程,将JOTM版本中lib下所有jar包拷贝到web-inf的lib下面
相关准备工作参考:http://jackyin5918.iteye.com/blog/1922379
主要包括:建数据库用户,建表,考jar包,拷贝tomcat 7jdbc pool的jar.
配置carol.properties,放置到src目录下面.
2. spring分布式事务的相关配置
注意这个org.springframework.transaction.jta.JotmFactoryBean类在Spring3中已经没有了,
需要下载spring2.5.6(附件中有)的代码然后拷贝代码,再在工程中新建一个包,
org.springframework.transaction.jta,然后创建JotmFactoryBean类.
<!-- 分布式 事务处理 开始.....--> <!-- PropertyPlaceholderconfigure是一个Bean后处理器,它读取属性文件信息, 并将这些信息设置为Spring配置文件元数据,这里用于读取数据库连接信息 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>dbconn.properties</value> <!-- 这里可列出多个属性文件 --> </list> </property> </bean> <!-- jotm实例,就是userTransaction(用户事务管理器) --> <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" /> <!-- 注意这个org.springframework.transaction.jta.JotmFactoryBean类在Spring3中已经没有了, 需要下载spring2.5.6的代码然后拷贝代码,再在工程中新建一个包, org.springframework.transaction.jta,然后创建JotmFactoryBean类. --> <!-- jta分布式事务管理器 --> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction" ref="jotm" /> </bean> <!--mysql数据源--> <bean id="mysqlDataSource" 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="${dbmysql.driverClassName}"/> <property name="url" value="${dbmysql.url}"/> <property name="user" value="${dbmysql.username}"/> <property name="password" value="${dbmysql.password}"/> </bean> </property> <!-- 这里必须额外再配置用户名和密码 --> <property name="user" value="${dbmysql.username}"/> <property name="password" value="${dbmysql.password}"/> </bean> <!--oracle数据源--> <bean id="oracleDataSource" 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="${dboracle.driverClassName}"/> <property name="url" value="${dboracle.url}"/> <property name="user" value="${dboracle.username}"/> <property name="password" value="${dboracle.password}"/> </bean> </property> <!-- 这里必须额外再配置用户名和密码 --> <property name="user" value="${dboracle.username}"/> <property name="password" value="${dboracle.password}"/> </bean> <!-- 配置和mysql数据源管理的数据库操作模板 ,用于操作数据库--> <bean id = "mysqlJdbcTpl" class = "org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref="mysqlDataSource"/> </bean> <!-- 配置和oracle数据源管理的数据库操作模板,用于操作数据库 --> <bean id = "oracleJdbcTpl" class = "org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="oracleDataSource"/> </bean> <!-- 配置两个数据源的Dao,并注入 JDBC数据库操作模板JdbcTemplate--> <bean id = "jtaDaoMysqlImp1" class = "test.spring.transaction.jta.JtaDaoMysqlImp1"> <property name="jtp" ref="mysqlJdbcTpl"/> </bean> <bean id = "jtaDaoOracleImp1" class = "test.spring.transaction.jta.JtaDaoOracleImp1"> <property name="jtp" ref="oracleJdbcTpl"/> </bean> <!-- 配置业务逻辑Bean,并注入相关的Dao组件 --> <bean id = "businessBean" class = "test.spring.transaction.jta.BusinessDaoImp1"> <property name="jtaDaoMysql" ref="jtaDaoMysqlImp1"/> <property name="jtaDaoOracle" ref="jtaDaoOracleImp1"/> </bean> <!-- 全局事务配置,主要是使用的transaction-manager不一样 配置增强处理的bean(相当于切面类),也是Spring自动生成普通 业务逻辑bean(targetBean)的代理Bean.里面的tx:method配置每个方法的事务属性, name配置方法名,可使用通配符. --> <tx:advice id="txJpaAdvice" transaction-manager="txManager"> <!-- 配置详细的事务语义 --> <tx:attributes> <!-- 表示get开头的方法是只读的 --> <tx:method name="get*" read-only="true" /> <!-- 其他方法使用默认的事务设置 --> <tx:method name="*" /> </tx:attributes> </tx:advice> <!-- 全局事务切面配置,AOP元素配置 --> <aop:config> <!-- 配置一个切入点 test.spring.transaction.jta包下面所有已Imp1结尾的类的所有方法, 即BusinessDaoImp1的doBusinuss()方法 --> <aop:pointcut id="myJpaPoint" expression="execution(* test.spring.transaction.jta.*Imp1.*(..))" /> <!-- 配置 (事务代理)切入点(aop:pointcut) 和 切面类(tx:advice),将二者关联起来 --> <aop:advisor advice-ref="txJpaAdvice" pointcut-ref="myJpaPoint" /> </aop:config> <!-- 分布式 事务处理 结束-->
3. 测试.
执行:test.spring.transaction.jta.TestSpringJTAClient类
初始化:
两个数据库的表都建立了唯一索引,保证数据不能重复插入,
在mysql中插入一条数据oracle中没有数据.
程序执行:
调用businessDao.doBusinuss();分别往oracle和msyql中插入同一条数据(
与mysql中已有数据重复)
在织入全局事务AOP之前,因为oracle中没有数据,所以往oracle中插入数据正常,
在mysql中插入数据报异常.程序执行完毕后,oracle中会被插入一条数据.
而在织入全局事务AOP之后,mysql中插入数据异常导致全局事务回滚,
这样,程序执行完毕后,oracle中仍然没有数据.
4. 尝试使用tomcat7的连接池代替XAPool连接池.
需要替换 org.enhydra.jdbc.pool.StandardXAPoolDataSource和
org.enhydra.jdbc.standard.StandardXADataSource
还没搞定.不知道怎么配置,待研究...
spring中使用 tomcat jdbc 连接池配置(局部事务,不支持全局事务的配置)
http://weitd.iteye.com/blog/1497020
注:根据类名找jar包的 网站:
http://www.jarfinder.com/index.php/jars/versionInfo/66324
附件文件名 后缀 需要相应的修改为 001,002,003,004
相关推荐
本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...
Spring框架作为一个广泛使用的Java应用程序开发框架,提供了多种支持事务管理的解决方案,其中包括集成JOTM(Java Open Transaction Manager)来处理分布式事务。本文将深入探讨Spring与JOTM结合使用的知识点,帮助...
这篇博客文章“使用JOTM实现分布式事务管理(多数据源)”将深入探讨如何利用JOTM来处理复杂的分布式环境中的事务。 首先,理解JTA是至关重要的。JTA是Java平台的标准,定义了API,使得应用开发者可以控制跨数据库、...
本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...
总结来说,Spring分布式事务实现主要依赖于Spring框架的事务管理能力、JOTM作为JTA实现的事务管理器,以及相关的JDBC驱动来连接数据库。通过声明式事务管理,开发者可以在不深入事务管理细节的情况下,编写出可靠的...
2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...
本文将深入探讨如何在Tomcat应用服务器上集成JTA,并使用JOTM(Java Open Transaction Manager)或Atomikos作为事务管理器来实现分布式事务。 首先,我们需要理解JTA的核心概念。JTA是Java EE平台的一部分,提供了...
JOTM(Java Open Transaction Manager)是一个开源的JTA事务管理器,可以在非J2EE环境下提供分布式事务服务。本篇文章将详细讲解如何利用Spring+iBatis+JOTM来实现JTA事务。 首先,我们需要理解JTA的核心概念。JTA...
JOTM是Java平台上的一个开放源代码事务管理器,它遵循JTA(Java Transaction API)标准,用于处理分布式事务。在Spring中集成JOTM可以提供更高级别的事务控制,确保在多数据源环境下事务的一致性和完整性。 首先,...
在Spring中,Java Transaction API (JTA) 和 JOTM(Java Open Transaction Manager)是实现分布式事务管理的关键组件。 **Spring 框架** Spring 是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于现代...
例子虽小,可覆盖面广,设计spring载入.properties文件,spring配置jta和jotm分布式事务,设置数据源连接池,注解事务驱动。功能是在mysql上建立了两个数据库分别为dbone和dbtwo,在dbone里有表tb1,表中只有一个字段...
JOTM是一个开源的Java事务管理器,实现了JTA(Java Transaction API),使得应用程序可以在分布式环境中进行事务管理。在Spring中,通过集成JOTM,可以实现全局的事务控制,确保在多资源操作中保持数据的一致性。 *...
在本篇文章中,我们将深入探讨如何利用Spring框架结合JOTM(Java Open Transaction Manager)来实现多数据源下的分布式事务管理。我们将通过具体实例展示如何在Tomcat服务器环境下配置并使用这些技术。 #### 一、...
通过Spring的`AbstractRoutingDataSource`和JTA,我们可以轻松地管理多个数据源,并通过JOTM保证分布式事务的一致性。在实际项目中,这种架构可以帮助我们构建可扩展、高可用的系统。在SpringDemo项目中,你可以找到...
本篇文章将探讨如何在Java环境中,利用Spring框架和Atomikos这样的第三方工具实现分布式事务管理,即JTA(Java Transaction API)的实践。 JTA是Java平台提供的一种标准API,用于管理跨越多个资源(如数据库、消息...
本DEMO主要展示了如何在Spring框架中结合JOTM来处理分布式事务,特别是涉及多个数据源的情况。 首先,我们需要理解JOTM的基本概念。JOTM作为一个事务协调者,负责管理跨多个资源的事务,确保它们要么全部成功,要么...
JOTM是Java事务API(JTA)的一个开源实现,用于管理跨多个资源(如数据库和消息队列)的分布式事务。在Spring中,JOTM可以作为全局事务管理器,处理跨越不同数据源的事务。当应用程序需要在多个数据库或者服务之间...
原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例那个类已经找不到了,所以我使用了atomikos。 因为xa接口的事务开销比较大,在项目中如果全部使用分布式的话,那么开销也是很大的,所以在项目中...