`
hanqunfeng
  • 浏览: 1541889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring4+Hibernate4+Atomikos3.3多数据源事务管理

 
阅读更多


Spring3+后不再对JTOM提供支持,所以可以改用Atomikos管理多数据源事务。
Spring2.5+Hibernate3+JTOM参考:http://hanqunfeng.iteye.com/blog/1554251

Atomikos官网网站:http://www.atomikos.com/  

一.pom.xml

<dependency>
			<groupId>com.atomikos</groupId>
			<artifactId>transactions-jdbc</artifactId>
			<version>3.9.3</version>
		</dependency>

 

二.applicationContext-atomikos.xml

<bean class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" id="dataSource01">
        <!-- Set unique name for this DataSource -->  
        <property name="uniqueResourceName"><value>oracle</value></property>
        <!-- Set XADatasource class name -->  
        <property name="xaDataSourceClassName" value="oracle.jdbc.xa.client.OracleXADataSource" />
             
        <property name="xaProperties">
            <props>
                <prop key="user">${jdbc.username01}</prop>
                <prop key="password">${jdbc.password01}</prop>
                <prop key="URL">${jdbc.url01}</prop>
            </props>
        </property> 
        <!-- set properties for datasource connection pool -->  
        <property name="poolSize" value="3" />
        <!-- timeout after 20000 seconds -->
        <property name="reapTimeout"><value>20000</value></property>  
    </bean>
    
   
 
    
    
    <bean id="sessionFactory01"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource01" />
        <property name="packagesToScan">
            <list>
                <value>com.cpframework.function.**.model.oracle</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.Oracle10gDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.current_session_context_class">jta</prop>
                <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
            </props>
        </property>
    </bean>


    <!-- oracleDAO -->
    <bean id="hibernateDAO01" class="org.cpframework.dao.hibernate4.CP_Hibernate4DAOImpl">
      <property name="sessionFactory" ref="sessionFactory01"></property>
    </bean>
    
    
    
    <bean class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" id="dataSource02">
        <!-- Set unique name for this DataSource -->  
        <property name="uniqueResourceName"><value>mysql</value></property>
        <!-- Set XADatasource class name -->
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
        
        <property name="xaProperties">
            <props>
                <prop key="user">${jdbc.username02}</prop>
                <prop key="password">${jdbc.password02}</prop>
                <prop key="URL">${jdbc.url02}</prop>
            </props>
        </property> 
        <!-- set properties for datasource connection pool -->  
        <property name="poolSize" value="3" />
       
        <property name="reapTimeout"><value>20000</value></property>  
    </bean>
    
  
    
    
    
    <bean id="sessionFactory02"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource02" />
        <property name="packagesToScan">
            <list>
                <value>com.cpframework.function.**.model.mysql</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.current_session_context_class">jta</prop>
                <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
            </props>
        </property>
    </bean>


    <!-- mysqlDAO -->
    <bean id="hibernateDAO02" class="org.cpframework.dao.hibernate4.CP_Hibernate4DAOImpl">
      <property name="sessionFactory" ref="sessionFactory02"></property>
    </bean>
    
 
    <!-- atomikos事务管理器 -->
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
        init-method="init" destroy-method="close">
        <description>UserTransactionManager</description>  
        <property name="forceShutdown">
            <value>true</value>
        </property>
    </bean>

    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="300" />
    </bean>
        
    <!-- spring 事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="atomikosTransactionManager"/>
        <property name="userTransaction" ref="atomikosUserTransaction" />
        <property name="allowCustomIsolationLevels" value="true"/> 
    </bean>

 <aop:config proxy-target-class="true">
        <aop:pointcut id="servicePoint"
            expression="execution (* com.cpframework.function.*.service.*.*Service*.*(..))" />
        <aop:advisor pointcut-ref="servicePoint" id="txAdvisor"
            advice-ref="defaultTxAdvice" />
    </aop:config>

  <tx:advice id="defaultTxAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true" />
            <tx:method name="get*" read-only="true" />
            <tx:method name="query*" read-only="true" />
            <tx:method name="load*" read-only="true" />
            <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
            <tx:method name="create*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="save*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="update*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="modify*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="delete*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="remove*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="apply*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
            <tx:method name="handle*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
                <tx:method name="do*" propagation="REQUIRED"
                rollback-for="java.lang.Exception" />
        </tx:attributes>
    </tx:advice>

 


三.transactions.properties
将transactions.properties文件放到编译根路径下,可根据需要开启相关注解,参见附件。

四.CP_Hibernate4DAOImpl
需要注意两点:
1.session必须使用sessionFactory.openSession()的方式获得,不能使用sessionFactory.getCurrentSession()。
2.更新操作必须调用session.flush()方法。
例如:

public void update(Object entity) {
Session session = sessionFactory.openSession();
session.update(entity);
session.flush();
}

 

参考:

http://www.liferay.com/zh/community/wiki/-/wiki/Main/JTA-XA+on+Tomcat/pop_up?controlPanelCategory=portlet_36

 

 

分享到:
评论

相关推荐

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

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

    spring+hibernate+atomikos多数据源

    Spring、Hibernate和Atomikos的组合就是一种强大的解决方案,它们可以协同工作以支持多数据源的分布式事务处理。接下来,我们将深入探讨这些技术以及如何配置它们来实现多数据源。 1. **Spring**: Spring是一个...

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

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

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

    为了实现多数据源的分布式事务,我们需要对Spring Boot进行配置,定义两个数据源并指定Atomikos作为事务管理器。每个数据源都需要相应的数据库连接信息,并且需要启用Atomikos的全局事务支持。在业务逻辑代码中,...

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

    - **配置文件**:`applicationContext.xml`是Spring的配置文件,其中会配置数据源、Hibernate SessionFactory、事务管理器等。这里可能会使用`PlatformTransactionManager`接口的实现,如`JtaTransactionManager`,...

    spring + hibernate + atomikos + mysql (diff database)

    7. **配置与集成**:将这些组件整合在一起需要详细的配置,包括Spring的事务管理配置、Hibernate的数据源配置以及Atomikos的设置,确保它们能够协同工作。 8. **测试与调试**:"dstest"可能是用于测试这个集成环境...

    spring hibernate atomikos 分布式事务

    3. 在Spring配置文件中配置数据源和JMS资源,声明为Atomikos的事务管理器所管理。 4. 使用`@Transactional`注解或者在XML配置中定义事务行为,声明哪些方法应该在一个事务内执行。 在实际应用中,Atomikos能够处理...

    spring 结合druid和hibernate使用jta配置分布式事务

    `Atomikos` 是一个开源的JTA实现,它提供了对分布式事务的支持,可以与Spring集成,处理多数据源的事务管理。 在Spring中配置Druid和Hibernate结合Atomikos进行分布式事务管理的步骤如下: 1. **引入依赖**:在...

    springboot-jpa atomikos 分布式事务管理

    5. 对于MyBatis和Hibernate,需要配置它们使用Atomikos提供的JTA支持,以确保在同一个事务中操作多个数据源。 通过上述配置,SpringBoot应用就能在Atomikos的帮助下,对多数据库进行分布式事务的统一管理。在处理...

    Java 分布式事务(多数据源)

    5. **多数据源配置**:在Spring Boot项目中,可以通过配置多个数据源来支持分布式事务。每个数据源对应一个数据库连接池,并使用特定的数据源事务管理器。 6. **开源工具和库**:如Atomikos、Bitronix等事务管理器...

    开源分布式事务管理组件Atomikos

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

    spring对多个数据库进行事务管理.doc

    Spring 框架确实提供了对多个数据库事务管理的支持,这对于多数据源的应用场景非常关键。在Spring中,事务管理可以通过编程式和声明式两种方式进行。编程式事务管理需要程序员手动控制事务的开始、提交、回滚等操作...

    atomikos-transactions-hibernate3.jar.zip

    在使用Atomikos Transactions Hibernate3.jar时,开发者需要在Hibernate配置中指定Atomikos作为事务管理器,并配置相应的属性,例如事务超时时间、数据源等。这通常在`hibernate.cfg.xml`文件中完成。一旦配置完毕,...

    Spring事务类型祥解

    当应用涉及到分布式系统时,Spring支持JTA(Java Transaction API)来处理跨多个数据源的事务,例如使用`JtaTransactionManager`。此外,Spring还提供了`Atomikos`和`Bitronix`这样的第三方事务管理器来实现全局...

    spring-jta-atomikos:JTA,JPA,Hibernate和Atomikos的Spring项目

    4. JPA和Hibernate的配置,包括实体定义、数据源配置、事务策略等。 5. 示例应用,展示了如何在一个事务中同时操作多个数据源,体现JTA的分布式事务能力。 通过研究这个项目,开发者可以学习如何在Spring环境中有效...

    atomikos-3.7.0

    1. **Java Transaction API (JTA)**:JTA是Java平台的标准接口,用于管理和协调跨越多个数据源的事务。通过JTA,开发者可以编写无需关心底层事务管理逻辑的应用,从而简化代码并提高可移植性。Atomikos 3.7.0实现了...

    Spring 事务 (二) Spring 声明式事务 配置

    10. **分布式事务**:在分布式系统中,Spring也提供了对JTA(Java Transaction API)的支持,允许跨多个数据源管理事务,例如使用Atomikos或Bitronix等JTA实现。 通过上述配置和理解,开发者可以轻松地在Spring应用...

    跨多个数据库操作,同时连接两个一上的数据库,用事物关联起来

    在Hibernate中,JTA事务应用总结通常会讲解如何配置Hibernate以使用JTA,以及在多数据源环境下如何处理事务。 跨库事务处理,如在spring+hibernate+struts2+jta的项目中,需要考虑的细节更多,包括异常处理、回滚...

Global site tag (gtag.js) - Google Analytics