文档章节

【分布式事务系列七】Atomikos的分布式案例

陶邦仁
 陶邦仁
发布于 2015/12/21 10:32
字数 1511
阅读 271
收藏 14

#0 系列目录#

#1 Atomikos使用非XA数据库驱动实现分布式事务# 项目地址见:Atomikos使用非XA数据库驱动实现分布式事务

##1.1 业务逻辑的操作## UserDao和LogDao,操作分别如下:

@Repository
public class UserDao {

    @Resource(name="jdbcTemplateA")
    private JdbcTemplate jdbcTemplate;

    public void save(User user){
        jdbcTemplate.update("insert into user(name,age) values(?,?)",user.getName(),user.getAge());
    }
}

@Repository
public class LogDao {

    @Resource(name="jdbcTemplateB")
    private JdbcTemplate jdbcTemplate;

    public void save(User user){
        jdbcTemplate.update("insert into log(name,age) values(?,?)",user.getName(),user.getAge());
    }
}

即上述两个JdbcTemplate使用不同的数据库。UserService综合上述两个业务操作,使它们处于同一个事务中:

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private LogDao logDao;

    @Transactional
    public void save(User user){
        userDao.save(user);
        logDao.save(user);
        throw new RuntimeException();
    }
}

##1.2 配置## 上述业务代码我们看不到分布式事务的存在,这种正是我们想要的效果,分布式事务对业务透明。到底是如何来实现呢? ###1.2.1 dataSource和JdbcTemplate配置###

<bean id="dataSourceA" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init"  destroy-method="close">
    <property name="uniqueResourceName" value="XA1DBMS" />  

       <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8" /> 
       <property name="user" value="root" /> 
       <property name="password" value="xxxx" /> 
       <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 

    <property name="poolSize" value="3" />  
    <property name="minPoolSize" value="3" />  
    <property name="maxPoolSize" value="5" />
</bean>

<bean id="dataSourceB" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init" destroy-method="close">   
    <property name="uniqueResourceName" value="XA2DBMS" />  

    <property name="url" value="jdbc:mysql://localhost:3306/test2?useUnicode=true&amp;characterEncoding=utf-8" /> 
       <property name="user" value="root" /> 
       <property name="password" value="xxxx" /> 
       <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 

    <property name="poolSize" value="3" />  
    <property name="minPoolSize" value="3" />  
    <property name="maxPoolSize" value="5" /> 
</bean>

<bean id="jdbcTemplateA" class="org.springframework.jdbc.core.JdbcTemplate">  
    <property name="dataSource" ref="dataSourceA" />  
</bean>  

<bean id="jdbcTemplateB" class="org.springframework.jdbc.core.JdbcTemplate">  
    <property name="dataSource" ref="dataSourceB" />  
</bean>

自行配置2个数据库地址,我们平常使用的dataSource,大部分是c3p0、dbcp等,这里就不能使用它们了,需要换成可以模拟XA协议的dataSource,这里即AtomikosNonXADataSourceBean

###1.2.2 事务配置### 我们知道分布式事务中需要一个事务管理器即接口javax.transaction.TransactionManager、面向开发人员的javax.transaction.UserTransaction。对于Atomikos来说分别对应如下:

  • com.atomikos.icatch.jta.UserTransactionImp
  • com.atomikos.icatch.jta.UserTransactionManager

我们如果想使用分布式事务的同时,又想使用Spring带给我们的@Transactional便利,就需要配置一个JtaTransactionManager,而该JtaTransactionManager是需要一个userTransaction实例的:

<bean id="userTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
    <property name="transactionTimeout" value="300" />  
</bean>  

<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
    <property name="userTransaction" ref="userTransaction" />   
</bean>

<tx:annotation-driven transaction-manager="springTransactionManager"/>

可以对比下jotm的案例配置jotm的分布式事务配置。可以看到jotm中使用的xapool中的StandardXADataSource是需要一个transactionManager的,而Atomikos使用的AtomikosNonXADataSourceBean则不需要。我们知道,StandardXADataSource中有了transactionManager就可以获取当前线程的事务,同时把XAResource加入进当前事务中去,而AtomikosNonXADataSourceBean却没有,它是怎么把XAResource加入进当前线程绑定的事务呢?这时候就需要可以通过静态方法随时获取当前线程绑定的事务

###1.2.3 jar包依赖### 这里只使用了Atomikos,不像jotm还使用了xapool。

<!-- atomikos -->
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jdbc</artifactId>
    <version>4.0.0M4</version>
</dependency>

#2 Atomikos使用XA数据库驱动实现分布式事务# 项目地址见:Atomikos使用XA数据库驱动实现分布式事务 ##2.1 业务逻辑的操作## UserDao和LogDao,操作分别如下:

@Repository
public class UserDao {

    @Resource(name="jdbcTemplateA")
    private JdbcTemplate jdbcTemplate;

    public void save(User user){
        jdbcTemplate.update("insert into user(name,age) values(?,?)",user.getName(),user.getAge());
    }
}

@Repository
public class LogDao {

    @Resource(name="jdbcTemplateB")
    private JdbcTemplate jdbcTemplate;

    public void save(User user){
        jdbcTemplate.update("insert into log(name,age) values(?,?)",user.getName(),user.getAge());
    }
}

即上述两个JdbcTemplate使用不同的数据库。UserService综合上述两个业务操作,使它们处于同一个事务中:

@Service
public class UserService {

    @Autowired
    private UserDao userDao;
    @Autowired
    private LogDao logDao;

    @Transactional
    public void save(User user){
        userDao.save(user);
        logDao.save(user);
        throw new RuntimeException();
    }
}

##2.2 配置## 上述业务代码我们看不到分布式事务的存在,这种正是我们想要的效果,分布式事务对业务透明。到底是如何来实现呢?

###2.2.1 dataSource和JdbcTemplate配置###

<bean id="dataSourceA" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
    <property name="uniqueResourceName" value="XA1DBMS" />  
    <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />  
    <property name="xaProperties">  
        <props>  
            <prop key="URL">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8</prop>  
            <prop key="user">root</prop>  
            <prop key="password">ligang</prop>  
        </props>  
    </property>  
    <property name="poolSize" value="3" />  
    <property name="minPoolSize" value="3" />  
    <property name="maxPoolSize" value="5" />
</bean>

<bean id="dataSourceB" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">   
    <property name="uniqueResourceName" value="XA2DBMS" />  
    <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />  
    <property name="xaProperties">  
        <props>  
            <prop key="URL">jdbc:mysql://localhost:3306/test2?useUnicode=true&amp;characterEncoding=utf-8</prop>  
            <prop key="user">root</prop>  
            <prop key="password">ligang</prop>  
        </props>  
    </property>  
    <property name="poolSize" value="3" />  
    <property name="minPoolSize" value="3" />  
    <property name="maxPoolSize" value="5" /> 
</bean>

自行配置上述2个数据库地址

我们平常使用的dataSource,大部分是c3p0、dbcp等,这里就不能使用它们了,需要换成可以Atomikos自己的dataSource,这里即AtomikosDataSourceBean。它需要使用支持XA的jdbc驱动。具体就是需要一个xaDataSourceClassName,我们这里使用的是mysql支持xa的MysqlXADataSource,它实现了javax.sql.XADataSource接口,即可以产生XAConnection连接

Atomikos使用非XA数据库驱动实现分布式事务 与 Atomikos使用XA数据库驱动实现分布式事务唯一配置上的不同就是这里的dataSource配置,其他内容都一样

###2.2.2 事务配置### 我们知道分布式事务中需要一个事务管理器即接口javax.transaction.TransactionManager、面向开发人员的javax.transaction.UserTransaction。对于Atomikos来说分别对应如下:

  • com.atomikos.icatch.jta.UserTransactionImp
  • com.atomikos.icatch.jta.UserTransactionManager

我们如果想使用分布式事务的同时,又想使用Spring带给我们的@Transactional便利,就需要配置一个JtaTransactionManager,而该JtaTransactionManager是需要一个userTransaction实例的:

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
    <property name="transactionTimeout" value="300" />  
</bean>  

<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
    <property name="userTransaction" ref="atomikosUserTransaction" />   
</bean>

<tx:annotation-driven transaction-manager="springTransactionManager"/>

###2.2.3 jar包依赖### 这里只使用了Atomikos,不像jotm还使用了xapool。

<!-- atomikos -->
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jdbc</artifactId>
    <version>4.0.0M4</version>
</dependency>

© 著作权归作者所有

共有 人打赏支持
陶邦仁
粉丝 1589
博文 420
码字总数 1483822
作品 0
海淀
技术主管
分布式架构_Index

分布式设计与开发 CAP原理和最终一致性(Eventually Consistency) 分布式算法 [分布式Paxos算法] 分布式一致性Hash算法 轮循算法(Round Robin) Hash求余算法(Hash) 最少连接算法(Least C...

陶邦仁
2015/12/07
1K
0
分布式事务系列(4.1)Atomikos的分布式案例

1 系列目录 - 分布式事务系列(开篇)提出疑问和研究过程- 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析- 分布式事务系列(1.2)Spring事务体系- 分布式事务系...

乒乓狂魔
2015/06/01
0
3
分布式事务系列(开篇)提出疑问和研究过程

1 前言 系列目录 - 分布式事务系列(开篇)提出疑问和研究过程- 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析- 分布式事务系列(1.2)Spring事务体系- 分布式事...

乒乓狂魔
2015/05/12
0
6
分布式事务系列(2.1)分布式事务的概念

1 系列目录 - 分布式事务系列(开篇)提出疑问和研究过程- 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析- 分布式事务系列(1.2)Spring事务体系- 分布式事务系...

乒乓狂魔
2015/05/21
0
7
分布式事务开源解决方案用例版--hihsoft-atomikos

【组件价值】 Atomikos 是一款 Java/JTA 事务处理工具 与spring完美结合,实现配置化分布式事务 多数据源分布式事务的开源解决方案 跨平台,不受应用服务器限制 也是学习spring、mybatis、j...

平凡哥
2014/08/07
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
48
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部