`
挪威的幽灵
  • 浏览: 41220 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring JTA 事务小记

    博客分类:
  • J2EE
阅读更多
最近一个项目要跨多数据,配多数据源的,其中就用到了事务,毫无疑问我选择的是Spring的声明式JTA事务。我的环境是JBOSS+ORACLE 9I
自己私下做了些实验,不过还是成功了
实验一:MySQL 5.0
采用atomikos的jta事务(要感谢 http://andyao.iteye.com/)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/main</value>
</property>
<property name="xaDataSourceClassName">
<!--使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/crm?useUnicode=true&amp;characterEncoding=UTF-8;user=root;password=root</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>
<!-- 第二个数据库 -->
<bean id="dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>mysql/news</value>
</property>
<property name="xaDataSourceClassName">
<!--
使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)
-->
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=jdbc:mysql://localhost:3306/crm2?useUnicode=true&amp;characterEncoding=UTF-8;user=root;password=root</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>

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />

<!-- 第一个数据库的sqlMapClient -->
<bean id="sqlMapClient1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<!-- 包含第一个数据库表的map -->
<value>classpath:SqlMapConfig.xml</value>
</property>
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler" />
</bean>
<!-- 第二个数据库的sqlMapClient -->
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<!-- 包含第一个数据库表的map -->
<value>classpath:SqlMapConfig2.xml</value>
</property>
<property name="dataSource" ref="dataSourceB" />
<property name="lobHandler" ref="lobHandler" />
</bean>

<!-- Optional: add a log administrator -->
<bean id="localLogAdministrator"
class="com.atomikos.icatch.admin.imp.LocalLogAdministrator"/>

<bean id="userTransactionService"
  class="com.atomikos.icatch.config.UserTransactionServiceImp"
  init-method="init" destroy-method="shutdownForce">
    <constructor-arg>
        <!-- IMPORTANT: specify all Atomikos properties here -->
        <props>
            <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
        </props>
    </constructor-arg>
    <property name="initialLogAdministrators">
        <list>
            <ref bean="localLogAdministrator"/>
        </list>
    </property>
</bean>
<!--Construct Atomikos UserTransactionManager,needed to configure Spring -->
<bean id="AtomikosTransactionManager"
      class="com.atomikos.icatch.jta.UserTransactionManager"
      init-method="init" destroy-method="close"
      depends-on="userTransactionService">
   <!--when close is called,should we force transactions to terminate or not?-->
   <property name="forceShutdown" value="false" />
</bean>
   <!--Also use Atomikos UserTransactionImp, needed to configure Spring-->
<bean id="AtomikosUserTransaction"
      class="com.atomikos.icatch.jta.UserTransactionImp" 
      depends-on="userTransactionService">
   <property name="transactionTimeout" value="300" />
</bean>
   <!-- Configure the Spring framework to use JTA transactions from Atomikos -->
<bean id="JtaTransactionManager"
      class="org.springframework.transaction.jta.JtaTransactionManager"
      depends-on="userTransactionService">
   <property name="transactionManager" ref="AtomikosTransactionManager" />
   <property name="userTransaction" ref="AtomikosUserTransaction" />
</bean>

<bean id="user1Dao" class="com.crm.code.dao.impl.User1DaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient1"/>
</property>
</bean>
<bean id="user2Dao" class="com.crm.code.dao.impl.User2DaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient2"/>
</property>
</bean>
<bean id="user12Service" class="com.crm.code.service.impl.User12ServiceImpl">
<property name="user1Dao">
<ref bean="user1Dao" />
</property>
<property name="user2Dao">
<ref bean="user2Dao" />
</property>
</bean>

</beans>
这样是成功的 可是切换oracle9i时悲剧发生了
--- Cause: com.atomikos.datasource.ResourceException: resume for XID oracle.jdbc.xa.OracleXid@145f939 raised -3: the XA resource detected an internal error
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in ibatis/Product1.xml. 
--- The error occurred while executing update. 
--- Check the          insert into boss_product     (PROD_ID,  PARENT_ID,  APP_ID,  PROD_NAME,  PROD_CODE,  DEFAULT_VER_PROD_ID,  DATA_PATH,  GMT_CREATED,  GMT_MODIFIED,  CREATOR,  MODIFIER,  IS_DELETED)      values     (seq_boss_product.nextval,      1,      88,      ?,      ?,      10,      'aaa',      sysdate,      sysdate,      'aavv',      'aacb',      'n')        . 

官方说oracle连接问题 哎。。。无语了
换了一种JTA事务机制 通过JOTM
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
          
   <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>   
   <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
         <property name="userTransaction" ref="jotm"/>
   </bean>          
   
    <bean id="dataSourceA" 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:@10.2.224.44:1521:trade"/> 
             </bean> 
         </property> 
         <property name="user" value="crm_aep"/> 
         <property name="password" value="crm_aep"/> 
     </bean> 

    <bean id="dataSourceB" 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:@10.2.226.24:1521:voucher"/> 
             </bean> 
         </property> 
         <property name="user" value="boss"/> 
         <property name="password" value="boss"/> 
     </bean> 

    <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />
          
<!-- 第一个数据库的sqlMapClient -->
<bean id="sqlMapClient1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<!-- 包含第一个数据库表的map -->
<value>classpath:SqlMapConfig_ora1.xml</value>
</property>
<property name="dataSource" ref="dataSourceA" />
</bean>
<!-- 第二个数据库的sqlMapClient -->
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<!-- 包含第一个数据库表的map -->
<value>classpath:SqlMapConfig_ora2.xml</value>
</property>
<property name="dataSource" ref="dataSourceB" />
</bean>


<bean id="product1Dao" class="com.crm.code.dao.impl.Product1DaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient1"/>
</property>
</bean>
<bean id="product2Dao" class="com.crm.code.dao.impl.Product2DaoImpl">
<property name="sqlMapClient">
<ref bean="sqlMapClient2"/>
</property>
</bean>
<bean id="product12Service" class="com.crm.code.service.impl.Product12ServiceImpl">
<property name="product1Dao">
<ref bean="product1Dao" />
</property>
<property name="product2Dao">
<ref bean="product2Dao" />
</property>
</bean>
</beans>

成功了。。。
很好很好 哈哈哈
分享到:
评论
1 楼 挪威的幽灵 2009-06-01  
事务这个东西有点多

相关推荐

    Spring配置JTA事务管理

    Spring框架在企业级Java应用中广泛用于实现事务管理,而JTA(Java Transaction API)是Java平台上的标准事务处理API,适用于分布式环境。本篇文章将深入探讨如何在Spring中配置JTA事务管理,以实现跨数据库和资源的...

    JTA事务源码示例

    Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...

    spring jta

    标题中的“Spring JTA”指的是Spring框架中的Java Transaction API(Java事务API)支持。Spring作为一个开源的、全面的企业级应用开发框架,它提供了对JTA的集成,使得开发者能够在分布式环境中处理事务。JTA是Java...

    在Spring中使用JTA事务管理

    在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...

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

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

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

    Spring框架提供了对JTA(Java Transaction API)的支持,允许开发者处理跨多个数据存储的事务一致性。本文将深入探讨如何在Tomcat应用服务器上集成JTA,并使用JOTM(Java Open Transaction Manager)或Atomikos作为...

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

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

    Spring+iBatis+JOTM实现JTA事务

    在Java开发中,事务管理是确保数据一致性与完整性...然而,需要注意的是,JTA事务管理相对于本地事务会有一定的性能开销,因此在不需要分布式事务的情况下,可以选择使用Spring的本地事务管理,以提高系统的运行效率。

    分布式事务操作之Spring+JTA+mybatis源码

    本话题主要聚焦于如何在Spring框架中结合Java Transaction API (JTA) 和 MyBatis 实现分布式事务管理。下面我们将详细探讨相关知识点。 1. **分布式事务**:在分布式系统中,事务处理跨越多个资源或服务,例如...

    事务处理:JTA事务

    JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。  要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。

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

    5. 开启Spring事务管理:在Spring的配置类中,启用@EnableTransactionManagement注解,配置PlatformTransactionManager为Atomikos的事务管理器。 6. 编写业务代码:在需要进行分布式事务的Service层方法上,使用@...

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

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

    tomcat 配置JTA事务

    在tomcat 中配置JTA 事务,方便管理web项目

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

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

    Jboss4.2.2+Spring2.5.6+hibernate+JTA事务的实现

    "Jboss4.2.2+Spring2.5.6+Hibernate+JTA事务的实现"就是一个典型的例子,它涉及到四个关键的技术栈,即JBoss Application Server 4.2.2、Spring 2.5.6、Hibernate ORM以及Java Transaction API(JTA)。这些技术的...

    springboot整合JTA组件,多数据源事务管理

    XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。 JTA事务比JDBC事务更强大。一个JTA事务...

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

    Spring的PlatformTransactionManager接口是Spring事务管理的核心,它提供了一种抽象的方式来管理事务。当选择使用JTA时,可以使用Spring的JtaTransactionManager,它实现了PlatformTransactionManager,并且与JTA...

    springboot整合jta实现多数据源事务管理

    在Spring Boot应用中,整合JTA(Java Transaction API)实现多数据源事务管理是一个常见的需求,特别是在分布式系统中,为了确保数据的一致性和完整性。本文将深入探讨如何配置和使用Spring Boot与JTA来管理多个...

    spring+jms+jta事务的消息发送和消息消费

    标题"spring+jms+jta事务的消息发送和消息消费"指的是一种利用Spring框架集成JMS进行消息传递,并通过JTA来管理分布式事务的场景。这样的设计允许应用程序在多组件环境中保证数据的一致性,即使在组件之间存在网络...

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

    综上所述,"第二部分spring+hibernate+jta 分布式事务Demo"涵盖了Spring、Hibernate和JTA在分布式事务管理中的核心概念和实践,是学习和理解这一领域的重要参考资料。通过学习和实践这个Demo,开发者可以提升自己在...

Global site tag (gtag.js) - Google Analytics