`
longgangbai
  • 浏览: 7337959 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】使用Atomikos Transactions Essentials实现多数据源JTA分布式事务

阅读更多

Atomikos数据源配置方法有三种

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> 
    接下来的代码和上例类同就不再写。

最近做的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 代码
 
  1. <!-- 第一个数据库 -->   
  2. < bean   id = "dataSource"   class = "com.atomikos.jdbc.SimpleDataSourceBean"   init-method = "init"  destroy-method = "close" >   
  3.     < property   name = "uniqueResourceName" >   
  4.         < value > mysql/main </ value >   
  5.     </ property >   
  6.     < property   name = "xaDataSourceClassName" >   
  7.         <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->   
  8.         < value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </ value >   
  9.     </ property >   
  10.     < property   name = "xaDataSourceProperties" >   
  11.         < value > URL =${jdbc.url}; user =${jdbc.username}; password =${jdbc.password} </ value >   
  12.     </ property >   
  13.     < property   name = "exclusiveConnectionMode" >   
  14.         < value > true </ value >   
  15.     </ property >   
  16.     < property   name = "connectionPoolSize" >   
  17.         < value > 3 </ value >   
  18.     </ property >   
  19.     < property   name = "validatingQuery" >   
  20.         < value > SELECT 1 </ value >   
  21.     </ property >   
  22. </ bean >   
  23. <!-- 第二个数据库 -->   
  24. < bean   id = "dataSourceB"   class = "com.atomikos.jdbc.SimpleDataSourceBean"   init-method = "init"   destroy-method = "close" >   
  25.     < property   name = "uniqueResourceName" >   
  26.         < value > mysql/news </ value >   
  27.     </ property >   
  28.     < property   name = "xaDataSourceClassName" >   
  29.         <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->   
  30.         < value > com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </ value >   
  31.     </ property >   
  32.     < property   name = "xaDataSourceProperties" >   
  33.         < value > URL =${jdbc.url.b}; user =${jdbc.username.b}; password =${jdbc.password.b} </ value >   
  34.     </ property >   
  35.     < property   name = "exclusiveConnectionMode" >   
  36.         < value > true </ value >   
  37.     </ property >   
  38.     < property   name = "connectionPoolSize" >   
  39.         < value > 3 </ value >   
  40.     </ property >   
  41.     < property   name = "validatingQuery" >   
  42.         < value > SELECT 1 </ value >   
  43.     </ property >   
  44. </ bean >   
  45.   
  46.   
  47. < bean   id = "lobHandler"   class = "org.springframework.jdbc.support.lob.DefaultLobHandler"   />   
  48.   
  49. <!-- 第一个数据库的sqlMapClient -->   
  50. < bean   id = "sqlMapClient"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >   
  51.     < property   name = "configLocation" >   
  52.         <!-- 包含第一个数据库表的map -->   
  53.         < value > classpath:/sqlmap-config.xml </ value >   
  54.     </ property >   
  55.     < property   name = "dataSource"   ref = "dataSource"   />   
  56.     < property   name = "lobHandler"   ref = "lobHandler"   />   
  57. </ bean >   
  58. <!-- 第二个数据库的sqlMapClient -->   
  59. < bean   id = "sqlMapClientB"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >   
  60.     < property   name = "configLocation" >   
  61.         <!-- 包含第一个数据库表的map -->   
  62.         < value > classpath:/sqlmap-configb.xml </ value >   
  63.     </ property >   
  64.     < property   name = "dataSource"   ref = "dataSourceB"   />   
  65.     < property   name = "lobHandler"   ref = "lobHandler"   />   
  66. </ bean >   
  67.   
  68. <!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->   
  69. < bean   id = "atomikosTransactionManager"   class = "com.atomikos.icatch.jta.UserTransactionManager"   init-method = "init"   
  70.     destroy-method = "close" >   
  71.     <!--  when close is called, should we force transactions to terminate or not? -->   
  72.     < property   name = "forceShutdown" >   
  73.         < value > true </ value >   
  74.     </ property >   
  75. </ bean >   
  76.   
  77. <!-- Also use Atomikos UserTransactionImp, needed to configure Spring  -->   
  78. < bean   id = "atomikosUserTransaction"   class = "com.atomikos.icatch.jta.UserTransactionImp" >   
  79.     < property   name = "transactionTimeout"   value = "240"   />   
  80. </ bean >   
  81.   
  82. <!-- Configure the Spring framework to use JTA transactions from Atomikos -->   
  83. < bean   id = "transactionManager"   class = "org.springframework.transaction.jta.JtaTransactionManager" >   
  84.     < property   name = "transactionManager" >   
  85.         < ref   bean = "atomikosTransactionManager"   />   
  86.     </ property >   
  87.     < property   name = "userTransaction" >   
  88.         < ref   bean = "atomikosUserTransaction"   />   
  89.     </ property >   
  90. </ bean >   



事务的配置, 使用了spring2.0的语法,所以将namesapce也帖出来了.

xml 代码
 
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
  3.        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
  4.        xmlns:aop = "http://www.springframework.org/schema/aop"   
  5.        xmlns:tx = "http://www.springframework.org/schema/tx"   
  6.        xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  7.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
  8.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"  
  9.        default-autowire = "byName"   default-lazy-init = "true" >   
  10.     <!-- 支持 @AspectJ 标记-->   
  11.     < aop:aspectj-autoproxy />   
  12.   
  13.     < aop:config   proxy-target-class = "true" >   
  14.         < aop:advisor   pointcut = "execution(* *Facade.*(..))"   advice-ref = "txAdvice" />   
  15.         < aop:advisor   pointcut = "execution(* *Manager.*(..))"   advice-ref = "txAdvice" />   
  16.     </ aop:config >   
  17.   
  18.     < tx:advice   id = "txAdvice" >   
  19.         < tx:attributes >   
  20.             < tx:method   name = "get*"   read-only = "true" />   
  21.             < tx:method   name = "find*"   read-only = "true" />   
  22.             < tx:method   name = "has*"   read-only = "true" />   
  23.             < tx:method   name = "locate*"   read-only = "true" />   
  24.             < tx:method   name = "*" />   
  25.         </ tx:attributes >   
  26.     </ tx:advice >   
  27. </ beans >   


这样配置以后就可以使用分布式事务,测试中出现异常时事务也自动提交。和JOTM相比Atomikos Transactions Essentials更加稳定,它原来是商业项目,现在开源了。象mysql一样卖服务支持的。而且论坛页比较活跃,有问题很快可以解决。

使用XADatasource的数据源配置 
Java代码   收藏代码
  1. <!-- 第一个数据库 -->  
  2.     <bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
  3.         <property name="uniqueResourceName">  
  4.             <value>mysql/main</value>  
  5.         </property>  
  6.         <property name="xaDataSourceClassName">  
  7.             <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->  
  8.             <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>  
  9.         </property>  
  10.         <property name="xaDataSourceProperties">  
  11.             <value>URL=${jdbc.url};user=${jdbc.username};password=${jdbc.password}</value>  
  12.         </property>  
  13.         <property name="exclusiveConnectionMode">  
  14.             <value>true</value>  
  15.         </property>  
  16.         <property name="connectionPoolSize">  
  17.             <value>3</value>  
  18.         </property>  
  19.         <property name="validatingQuery">  
  20.             <value>SELECT 1</value>  
  21.         </property>  
  22.     </bean>  
  23.     <!-- 第二个数据库 -->  
  24.     <bean id="dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
  25.         <property name="uniqueResourceName">  
  26.             <value>mysql/news</value>  
  27.         </property>  
  28.         <property name="xaDataSourceClassName">  
  29.             <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->  
  30.             <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>  
  31.         </property>  
  32.         <property name="xaDataSourceProperties">  
  33.             <value>URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}</value>  
  34.         </property>  
  35.         <property name="exclusiveConnectionMode">  
  36.             <value>true</value>  
  37.         </property>  
  38.         <property name="connectionPoolSize">  
  39.             <value>3</value>  
  40.         </property>  
  41.         <property name="validatingQuery">  
  42.             <value>SELECT 1</value>  
  43.         </property>  
  44.     </bean>  
分享到:
评论

相关推荐

    Springboot 动态多数据源 jta分布式事务

    本资源针对的是Spring Boot动态多数据源和JTA(Java Transaction API)分布式事务的实现,对于初学者来说非常实用。下面我们将深入探讨这些知识点。 首先,让我们了解一下Spring Boot的多数据源。在许多业务场景下...

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

    Atomikos通过实现JTA规范,允许应用程序在不同的数据源之间进行跨系统事务处理。 JPA是Java平台上的标准ORM(Object-Relational Mapping)框架,用于管理和持久化Java对象到关系数据库。它提供了一种抽象层,使得...

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

    本文将深入探讨如何在Spring Boot项目中实现Atomikos分布式事务以及动态数据源切换的两种示例。 首先,我们需要理解什么是分布式事务。在分布式系统中,事务需要跨越多个独立的数据库或服务进行操作。分布式事务的...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    使用Spring的`AbstractRoutingDataSource`,我们可以实现数据源的动态选择。这个抽象类会根据当前的业务上下文(例如,通过`ThreadLocal`变量)决定使用哪个数据源。这样,我们可以在运行时根据业务需求灵活地切换...

    springboot多数据源即分布式事务解决方案

    本文将详细探讨SpringBoot如何实现多数据源以及分布式事务。 首先,我们要理解什么是多数据源。多数据源意味着一个应用可以同时连接和操作多个数据库。在SpringBoot中,我们可以通过配置不同的DataSource Bean来...

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    通常,我们可以使用`JtaTransactionManager`配合Atomikos、Bitronix等JTA实现来处理分布式事务。以下是一个简单的示例: ```java @Configuration @EnableTransactionManagement public class TransactionConfig { ...

    Spring Boot + Druid + Mybatis + Atomikos 配置多数据源 并支持分布式事务

    本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...

    Spring Boot+Druid+Mybatis实现JTA分布式事务

    JTA是Java平台企业版(Java EE)的一部分,它为应用提供了统一的事务管理接口,支持跨多个数据源的分布式事务。这意味着在一个事务中,可以同时对多个数据库或资源进行操作,确保数据的一致性和完整性。 Spring ...

    Spring3.0+Hibernate+Atomikos多数据源分布式事务管理

    本教程将聚焦于如何利用Spring 3.0、Hibernate ORM框架以及Atomikos这个开源事务管理器来实现高效、可靠的多数据源分布式事务处理。 **Spring 3.0**: Spring是Java开发中最广泛使用的轻量级框架之一,它提供了一个...

    Spring+MyBatis+Atomikos实现JTA分布式事务

    本文将深入探讨如何使用Spring、MyBatis和Atomikos实现JTA分布式事务。 首先,让我们理解JTA的概念。Java Transaction API(JTA)是Java EE规范之一,用于处理分布式环境中的事务。它允许应用程序在不同的资源管理...

    Spring+Mybatis+Atomikos实现JAVA初始化并控制多个数据源+分布式事务

    总的来说,这个DEMO旨在帮助开发者理解如何在Java应用中实现多数据源和分布式事务,涉及到的核心技术包括Spring的多数据源支持、Mybatis的持久层操作以及Atomikos的事务协调。通过实践这个DEMO,开发者可以深入掌握...

    Spring boot+Atomikos+JTA+Hibernate+mybatis+MySQL实现分布式事务+多数据源

    本案例主要探讨如何利用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate以及MyBatis,结合MySQL数据库,实现一个跨数据源的分布式事务解决方案。 首先,Spring Boot是一个基于Spring框架的快速开发...

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

    本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...

    SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式

    本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...

    使用springboot+jta+atomikos配置多数据源事务

    本教程将详细介绍如何使用Spring Boot结合JTA(Java Transaction API)和Atomikos来配置多数据源事务。 首先,我们需要理解JTA的含义。JTA是Java平台的标准,用于管理跨多个数据源的分布式事务。它允许应用程序在一...

    springboot+mybatis+druid+atomikos 多数据源,分布式事务,集成websocket,redis,swagger2

    在本项目中,我们主要探讨的是如何利用Spring Boot、MyBatis、Druid、Atomikos、WebSocket、Redis以及Swagger2构建一个具有多数据源、分布式事务管理,并且集成了实时通信与API文档管理功能的高级应用。下面将对这些...

    Atomikos Transactions Guide

    - 本指南旨在帮助用户了解JTA(Java Transaction API),掌握Atomikos Transactions Essentials的安装和配置,以及如何在应用程序中实现事务支持。 2. **事务基础知识**: - 事务是指一系列的操作,这些操作要么...

    第二部分spring+hibernate+jta 分布式事务Demo

    Atomikos提供的实现使得JTA能够在不同的数据源和持久化层之间进行协调,确保ACID(原子性、一致性、隔离性和持久性)属性。 4. **源码分析**: 深入理解这个Demo,我们可以查看Atomikos的源码,了解其如何处理事务...

    Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源(可运行)

    本项目使用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate和MySQL来实现分布式事务处理和多数据源管理,以确保在多个数据库操作之间保持事务的ACID特性。 首先,Spring Boot作为微服务开发的主流...

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

    总结,结合Spring和Atomikos可以有效地处理分布式事务,确保跨多个数据源的操作在事务性语义下执行。配置包括设置Atomikos事务管理器、数据源以及事务属性,然后在业务逻辑中利用Spring的`@Transactional`注解来管理...

Global site tag (gtag.js) - Google Analytics