`
mengqingyu
  • 浏览: 333349 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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> 
	接下来的代码和上例类同就不再写。
分享到:
评论
9 楼 xing0029 2015-12-29  
这样配置的话 事物不成功啊 还有什么地方需要注意的么 可以加我Q么669032669
8 楼 mengqingyu 2015-01-17  
liuxiaolu 写道
jotm的我的没有成功,楼主能否帮助一下

推荐用Atomikos这个相对比较完善
7 楼 liuxiaolu 2015-01-13  
jotm的我的没有成功,楼主能否帮助一下
6 楼 mengqingyu 2011-04-20  
分开用。。
5 楼 zsj614 2011-04-19  
mengqingyu 写道
wad12302 写道
为什么
<tx:method name="*" read-only="true"/>   

有这个之后‘

我使用 doXXX的方式一样能够  insert成功“”

这个我没试验过,因为我在不用多数据源插入操作时候,都不会使用jta数据源,因为性能不好。只有在必须使用时候才会用。

那你配两个事务吗?多数库插入的时候用jta的,单数据库的时候用另一种事务?这样吗?在一个系统
4 楼 mengqingyu 2011-02-26  
wad12302 写道
为什么
<tx:method name="*" read-only="true"/>   

有这个之后‘

我使用 doXXX的方式一样能够  insert成功“”

这个我没试验过,因为我在不用多数据源插入操作时候,都不会使用jta数据源,因为性能不好。只有在必须使用时候才会用。
3 楼 wad12302 2011-02-26  
为什么
<tx:method name="*" read-only="true"/>   

有这个之后‘

我使用 doXXX的方式一样能够  insert成功“”
2 楼 mengqingyu 2010-07-15  
可以回滚!
1 楼 Jhonney 2010-07-12  
jotm那个配置,你能成功进行事务处理,能够回滚??

相关推荐

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

    本文将深入探讨如何在Tomcat应用服务器上集成JTA,并使用JOTM(Java Open Transaction Manager)或Atomikos作为事务管理器来实现分布式事务。 首先,我们需要理解JTA的核心概念。JTA是Java EE平台的一部分,提供了...

    Atomikos实现分布式事务

    Atomikos 是一款开源的分布式事务处理库,它为Java应用程序提供了支持JTA(Java Transaction API)的事务管理服务。JTA是Java平台标准中定义的用于处理分布式事务的API,允许开发者在一个全局事务中处理多个数据库...

    集成jta-atomikos 实现分布式事务.zip

    本文将深入探讨如何在SpringBoot框架中集成JTA(Java Transaction API)和Atomikos来实现分布式事务管理。这是一项关键的技术,特别是在微服务架构中,它保证了跨服务操作的原子性。 首先,`pom.xml`是Maven项目的...

    java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip

    8. **集成与配置**: 集成Atomikos到Spring Boot项目中,需要在配置文件中设置相关的事务管理属性,比如数据源、事务超时时间等,并且需要在代码中适当地声明和管理事务边界。 9. **测试与监控**: 在分布式事务环境...

    spring + JTA + atomikos 实现分布式事务

    分布式事务是现代企业级应用中不可或缺的技术,尤其是在大数据和微服务架构中,保证数据的一致性和完整性至关重要。Spring 框架提供了强大的事务管理能力,而JTA(Java Transaction API)是Java平台上的标准分布式...

    使用Spring+atomikos实现分布式事务

    这就是Atomikos的角色,它实现了JTA,允许应用程序在分布式环境中进行跨系统的事务处理。 **配置Spring与Atomikos** 1. **配置Atomikos**: 首先,我们需要在项目中引入Atomikos的依赖。在`pom.xml`中添加相应的...

    SpringBoot+Atomikos分布式事务及多数据源动态切换,两种demo

    Spring Boot集成Atomikos进行分布式事务管理,主要步骤包括: 1. 引入依赖:在项目中添加Atomikos的依赖,确保项目能够访问其提供的JTA服务。 2. 配置Atomikos:配置文件中设置Atomikos的相关参数,如事务超时时间、...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    spring + JTA + JOTM实现分布式事务

    分布式事务是现代企业级应用中不可或缺的一部分,尤其是在大数据和微服务架构中,它确保了在多个数据库或资源管理系统中的数据一致性。本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java ...

    集成atomikos实现分布式事务.zip

    在IT行业中,分布式事务是一个重要的概念,特别是在构建大型、高可用性的系统时。Atomikos是一个开源的事务...通过上述步骤,开发者可以将Atomikos与Spring Boot的事务管理机制紧密结合,构建出高可用的分布式应用。

    spring mybatis atomikos 多库分布式事务demo

    Atomikos是Java环境下的一款强大的事务处理工具,支持JTA(Java Transaction API),能处理复杂的分布式事务需求。在Spring中整合Atomikos,可以实现全局的事务管理,即使跨越多个数据库,也能确保ACID(原子性、...

    spring 结合druid和hibernate使用jta配置分布式事务

    `Atomikos` 是一个开源的JTA实现,它提供了对分布式事务的支持,可以与Spring集成,处理多数据源的事务管理。 在Spring中配置Druid和Hibernate结合Atomikos进行分布式事务管理的步骤如下: 1. **引入依赖**:在...

    非Maven基于SSM+Atomikos的分布式事务处理案例源码

    4. **Atomikos**:Atomikos是一个符合JTA(Java Transaction API)标准的事务管理器,支持XA分布式事务协议。在分布式环境中,它能确保跨多个数据源的操作要么全部成功,要么全部回滚,实现ACID(原子性、一致性、...

    springboot-jpa atomikos 分布式事务管理

    通过上述配置,SpringBoot应用就能在Atomikos的帮助下,对多数据库进行分布式事务的统一管理。在处理事务时,Atomikos会跟踪事务的边界,确保所有操作要么全部成功,要么全部回滚,从而保证了数据的一致性。 总的来...

    Atomikos分布式事务DEMO

    在这个DEMO中,Tomcat承载了Spring和MyBatis的应用,并且通过Atomikos的JTA支持,能够在多线程环境下处理分布式事务。 压缩包中的"atomikosJtaTx_Transform"可能包含以下内容:配置文件(如atomikos.properties)、...

    spring4+atomikos实现分布式事务

    在IT行业中,分布式事务是一个重要的概念,特别是在大型系统和微服务架构中,它涉及到多个数据库或数据源的协调操作,确保数据的一致性和完整性。Spring框架作为Java领域中广泛使用的应用开发框架,提供了多种处理...

    spring搭建分布式事务所需嘉宝atomikos加druid配置分布式事务

    Spring框架提供了多种实现分布式事务管理的方式,其中一种是通过集成第三方工具如Atomikos来实现。Atomikos是一个开源的事务处理服务,支持JTA(Java Transaction API),能很好地处理分布式环境中的ACID(原子性、...

    Java分布式开发spring+jta+jotm

    "Java分布式开发spring+jta+jotm"的主题涵盖了Spring框架在分布式系统中的应用,特别是如何利用JTA和JOTM来处理跨资源的分布式事务。理解和掌握这些技术对于构建可扩展、健壮的Java应用至关重要。通过深入学习和实践...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    Atomikos分布式事务处理所需jar包

    Atomikos是一个开源的事务处理系统,专门设计用于在Java应用程序中实现分布式事务管理。它提供了JTA(Java Transaction API)的实现,使得开发者能够在不同的数据源之间进行复杂的事务操作,确保数据的一致性和完整...

Global site tag (gtag.js) - Google Analytics