前面简单介绍了JOTM如何在Spring中配置,并如何使用它的JTA事务,本节将介绍Atomikos如何与Spring集成,并使用它的JTA事务。

Atomikos,是一个基于Java的开源事务管理器,提供了事务管理和连接池,不需要应用服务器支持,支持JDBC和JMS事务,能提供对Spring,Hibernate的集成,有兴趣多了解的可以直接参考说明文当,有详细的介绍和使用说明。

Atomikos可以到http://www.atomikos.com/products.html#ate下载,最新版本是3.2.0

首先,仍然是一个相关的配置文件,用来设置相关的环境,打开解压缩后Atomikos根目录,拷贝jta.properties到classpath中,并修改为如下内容 
jta.properties

  1. com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
  2. com.atomikos.icatch.console_file_name = tm.out
  3. com.atomikos.icatch.log_base_name = tmlog
  4. com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm
  5. com.atomikos.icatch.console_log_level = INFO

随后,是Spring上下文配置,建立一个名为ApplicationContext-atomikos.xml的Spring上下文

ApplicationContext-atomikos.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. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  5. <!-- XA Datasource -->
  6. <bean id="datasource1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
  7. <property name="uniqueResourceName">
  8. <value>mysql/main</value>
  9. </property>
  10. <property name="xaDataSourceClassName">
  11. <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
  12. </property>
  13. <property name="xaDataSourceProperties">
  14. <value>URL=jdbc:mysql://localhost:3306/test;user=root;password=admin</value>
  15. </property>
  16. <property name="exclusiveConnectionMode">
  17. <value>true</value>
  18. </property>
  19. <property name="connectionPoolSize">
  20. <value>3</value>
  21. </property>
  22. <property name="validatingQuery">
  23. <value>SELECT 1</value>
  24. </property>
  25. </bean>
  26. <bean id="datasource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
  27. <property name="uniqueResourceName">
  28. <value>mysql/news</value>
  29. </property>
  30. <property name="xaDataSourceClassName">
  31. <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
  32. </property>
  33. <property name="xaDataSourceProperties">
  34. <value>URL=jdbc:mysql://localhost:3306/test2;user=root;password=admin</value>
  35. </property>
  36. <property name="exclusiveConnectionMode">
  37. <value>true</value>
  38. </property>
  39. <property name="connectionPoolSize">
  40. <value>3</value>
  41. </property>
  42. <property name="validatingQuery">
  43. <value>SELECT 1</value>
  44. </property>
  45. </bean>
  46. <bean id="template1" class="org.springframework.jdbc.core.JdbcTemplate">
  47. <property name="dataSource" ref="datasource1" />
  48. </bean>
  49. <bean id="template2" class="org.springframework.jdbc.core.JdbcTemplate">
  50. <property name="dataSource" ref="datasource2" />
  51. </bean>
  52. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
  53. <property name="forceShutdown"><value>true</value></property>
  54. </bean>
  55. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  56. <property name="transactionTimeout" value="300"/>
  57. </bean>
  58. <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
  59. <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>
  60. <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>
  61. </bean>
  62. <bean id="dao1" class="com.xa.dao.UserDao1">
  63. <property name="jdbcTemplate">
  64. <ref bean="template1"></ref>
  65. </property>
  66. </bean>
  67. <bean id="dao2" class="com.xa.dao.UserDao2">
  68. <property name="jdbcTemplate">
  69. <ref bean="template2"></ref>
  70. </property>
  71. </bean>
  72. <!-- -->
  73. <bean id="userServiceTarget" class="com.xa.service.UserServiceImpl">
  74. <property name="dao1" ref="dao1"/>
  75. <property name="dao2" ref="dao2"/>
  76. </bean>
  77. <bean id="userTest" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  78. <property name="transactionManager">
  79. <ref bean="springTransactionManager"/>
  80. </property>
  81. <property name="target">
  82. <ref bean="userServiceTarget"/>
  83. </property>
  84. <property name="transactionAttributes">
  85. <props>
  86. <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
  87. </props>
  88. </property>
  89. </bean>
  90. </beans>

看上下文中的代码,很大部分和JOTM的相似,atomikos使用com.atomikos.jdbc.SimpleDataSourceBean类来创建datasource bean,这里需要特别注意

  1. <property name="uniqueResourceName">
  2. <value>mysql/main</value>
  3. </property>
  1. <property name="uniqueResourceName">
  2. <value>mysql/news</value>
  3. </property>

上面的代码为每个Datasource配置了一个唯一的名称,名称不允许相同,否则将会使用同一个datasource,而不会出现异常。

另外在配置文件中定义了Atomikos的事务管理器,并在Spring的JtaTransactionManager中引用

  1. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
  2. <property name="forceShutdown"><value>true</value></property>
  3. </bean>
  4. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  5. <property name="transactionTimeout" value="300"/>
  6. </bean>
  7. <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
  8. <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>
  9. <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>
  10. </bean>

其它的代码没什么特别,和JOTM配置基本相同,JdbcTemplate,DAO,Service,事务代理等等....

仍然使用TestXa.java,修改成引用ApplicationContext-atomikos.xml的上下文配置

  1. protected String[] getConfigLocations() {
  2. //return new String[] { "classpath:ApplicationContext-jotm.xml" };
  3. return new String[] { "classpath:ApplicationContext-atomikos.xml" };
  4. }

运行test,然后查看数据库状态, 
然后修改方法参数使其不违反数据库约束,再运行Test观察数据库 :)。

Spring JTA应用JOTM & Atomikos III Atomikos的更多相关文章

  1. Spring JTA应用JOTM & Atomikos I Application

    关于Spring JTA的介绍非常多了,这里就不再一再阐述其优越性怎么怎么了,直接开始正题.一个大致的需求如下,用户在进行增删改操作时,会同时更新2至3个数据库的数据表,操作需要事务来包裹,以便在操作 ...

  2. Spring JTA应用JOTM & Atomikos II JOTM

    上节建立了一个简单的Java Application以及所需要的数据库和数据表,本节将介绍JOTM在Spring中的配置. JOTM(Java Open Transaction Manager)是Ob ...

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

    一.以下介绍Spring中直接集成JOTM提供JTA事务管理.将JOTM集成到Tomcat中. (经过测试JOTM在批量持久化时有BUG需要修改源码GenericPool类解决)! 参考文章http: ...

  4. DTP模型之二:(XA协议之二)JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    jotm只能用的xapool数据源,而且很少更新. 一.以下介绍Spring中直接集成JOTM提供JTA事务管理.将JOTM集成到Tomcat中. (经过测试JOTM在批量持久化时有BUG需要修改源码 ...

  5. Spring JTA multiple resource transactions in Tomcat with Atomikos example--转载

    原文地址:http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-a ...

  6. Spring JTA multiple resource transactions in Tomcat with Atomikos example

    http://www.byteslounge.com/tutorials/spring-jta-multiple-resource-transactions-in-tomcat-with-atomik ...

  7. 分布式事务操作之Spring+JTA

    什么是分布式事务?在网上找了一段比较容易理解的"定义". 分布式事务是指事务的参与者.支持事务的服务器.资源管理器以及事务管理器分别位于分布系统的不同节点之上,在两个或多个网络计算 ...

  8. Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)

    在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子. 请通过以下方式下载github源代码: git clone https://github.com/d ...

  9. Spring+JTA+Atomikos+mybatis分布式事务管理

    我们平时的工作中用到的Spring事务管理是管理一个数据源的.但是如果对多个数据源进行事务管理该怎么办呢?我们可以用JTA和Atomikos结合Spring来实现一个分布式事务管理的功能.了解JTA可 ...

随机推荐

  1. (转)ios获取设备系统信息

    UIDevice *device_=[[UIDevice alloc] init]; NSLog(@"设备所有者的名称--%@",device_.name); NSLog(@&qu ...

  2. JavaScript中Element与Node的区别,children与childNodes的区别

    关于Element跟Node的区别,cilldren跟childNodes的区别很多朋友弄不清楚,本文试图让大家明白这几个概念之间的区别. Node(节点)是DOM层次结构中的任何类型的对象的通用名称 ...

  3. 【Python】入门 list有些不懂

    # -*- coding: utf-8 -*- # -*- coding: cp936 -*- 首行加这个 代码里就可以加注释 raw_input("Press Enter Exit&quo ...

  4. spring.net IOC容器

    spring.net 通过配置文件的方式 帮我们实现了IoC功能,实现方式非常灵活,且多种多样. 点击查看 创建对象 我们只需定义接口和实现方法,spring.net帮我们实现了其他功能. 第一步,定 ...

  5. 《Unix网络编程》卷2 读书笔记 第1章-简介

    1. 概述 2. 进程.线程与信息共享 Unix进程间的信息共享有多种方式:注意下图中内核的位置   左边的两个进程共享存留于文件系统中某个文件上的某些信息.为访问这些信息,每个进程都得穿越内核. 中 ...

  6. 平板与PC的文件交互及播放

    发现在kindle上可以用ES开个浏览器,把FTP打开,实现文件的互访,之前还弄了一个大圈下了一大堆的垃圾软件, 而看电脑上的流媒体的话,则可以用dice播放器add一下samba就可以了

  7. 【初识——最大流】 hdu 1532 Drainage Ditches(最大流) USACO 93

    最大流首次体验感受—— 什么是最大流呢? 从一个出发点(源点),走到一个目标点(汇点),途中可以经过若干条路,每条路有一个权值,表示这条路可以通过的最大流量. 最大流就是从源点到汇点,可以通过的最大流 ...

  8. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

  9. 【LeetCode】168 & 171- Excel Sheet Column Title & Excel Sheet Column Number

    168 - Excel Sheet Column Title Given a positive integer, return its corresponding column title as ap ...

  10. arp spoofing

    Today our tutorial will talk about Kali Linux Man in the Middle Attack. How to perform man in the mi ...