zoukankan      html  css  js  c++  java
  • Spring JTA应用JOTM & Atomikos III Atomikos

    前面简单介绍了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 

    Java代码  收藏代码
    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 

    Java代码  收藏代码
    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.       
    27.     <bean id="datasource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">     
    28.         <property name="uniqueResourceName">     
    29.             <value>mysql/news</value>  
    30.         </property>     
    31.         <property name="xaDataSourceClassName">     
    32.             <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>     
    33.         </property>  
    34.         <property name="xaDataSourceProperties">     
    35.             <value>URL=jdbc:mysql://localhost:3306/test2;user=root;password=admin</value>     
    36.         </property>     
    37.         <property name="exclusiveConnectionMode">     
    38.             <value>true</value>     
    39.         </property>     
    40.         <property name="connectionPoolSize">     
    41.             <value>3</value>     
    42.         </property>     
    43.         <property name="validatingQuery">     
    44.             <value>SELECT 1</value>     
    45.         </property>     
    46.     </bean>  
    47.       
    48.     <bean id="template1" class="org.springframework.jdbc.core.JdbcTemplate">  
    49.         <property name="dataSource" ref="datasource1" />  
    50.     </bean>  
    51.       
    52.     <bean id="template2" class="org.springframework.jdbc.core.JdbcTemplate">  
    53.         <property name="dataSource" ref="datasource2" />  
    54.     </bean>  
    55.           
    56.     <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">  
    57.         <property name="forceShutdown"><value>true</value></property>  
    58.     </bean>  
    59.       
    60.     <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
    61.         <property name="transactionTimeout" value="300"/>   
    62.     </bean>  
    63.   
    64.     <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
    65.         <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>  
    66.         <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>  
    67.     </bean>  
    68.       
    69.     <bean id="dao1" class="com.xa.dao.UserDao1">  
    70.         <property name="jdbcTemplate">  
    71.             <ref bean="template1"></ref>  
    72.         </property>  
    73.     </bean>  
    74.       
    75.     <bean id="dao2" class="com.xa.dao.UserDao2">  
    76.         <property name="jdbcTemplate">  
    77.             <ref bean="template2"></ref>  
    78.         </property>  
    79.     </bean>  
    80.     <!-- -->  
    81.     <bean id="userServiceTarget" class="com.xa.service.UserServiceImpl">  
    82.         <property name="dao1" ref="dao1"/>  
    83.         <property name="dao2" ref="dao2"/>  
    84.     </bean>  
    85.       
    86.     <bean id="userTest" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">      
    87.         <property name="transactionManager">  
    88.             <ref bean="springTransactionManager"/>  
    89.         </property>      
    90.         <property name="target">  
    91.             <ref bean="userServiceTarget"/>  
    92.         </property>  
    93.         <property name="transactionAttributes">          
    94.             <props>  
    95.                 <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>              
    96.             </props>  
    97.         </property>  
    98.     </bean>  
    99. </beans>  



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

    Java代码  收藏代码
    1. <property name="uniqueResourceName">     
    2.     <value>mysql/main</value>     
    3. </property>    



    Java代码  收藏代码
    1. <property name="uniqueResourceName">     
    2.     <value>mysql/news</value>  
    3. </property>  


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

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

    Java代码  收藏代码
    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.       
    5.     <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
    6.         <property name="transactionTimeout" value="300"/>   
    7.     </bean>  
    8.   
    9.     <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
    10.         <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>  
    11.         <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>  
    12.     </bean>  



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

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

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



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

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/chenying99/p/3183169.html
Copyright © 2011-2022 走看看