`

spring+hibernate+jta 分布式事务Demo

 
阅读更多

0、设计分布式数据库,修改第一部分的例子。先将db1中的user1表中的记录清除,把user2表drop掉,然后create一个新的 database db2来模拟分布式数据库,在db2中新建一张表user2,结构和user1一致。接下来的操作就是同时对2个数据库的2张表进行操作了。clip_image001

clip_image003clip_image005

1、DAO接口、DAOImpl实现,Service接口、ServiceImpl实现都不用去动它,为使第一次测试时事务顺利提交,我们把第一部分中对于serviceImpl中insert方法中故意制造的困难去除。clip_image006

——————————————————————————————

文件:class User1AndUser2ServiceImpl.java

代码:

public void insertUser1AndUser2(User1 user) {

try{

System.out.println("insertUser1AndUser2 方法开始执行");

User1 insertedUser1=user1DAOImpl.insertUser1(user);

User2 user2=new User2();

//String tmp="制造困难制造困难制造困难制造困难制造困难制造困难制造困难制造困难制造困难制造困难制造困难制造困难";

//user2.setName(insertedUser1.getName()+tmp);

user2.setName(insertedUser1.getName());

user2DAOImpl.insertUser2(user2);

}

catch(DataAccessException e){

System.err.println("service 抛出异常");

throw e;

}

}

——————————————————————————————————————————

2、spring是不能直接管理分布式事务的,需要管理的话就得借助jta,但是jta又不能运行在tomcat这个容器中,于是我们就要用到 AtomikosTransactionsEssentials这个第三方jar包来提供jta支持。 AtomikosTransactionsEssentials可以从http://www.atomikos.com下载,当然我这里也提供这些类包的ftp下载(ftp下载,勾选连接到服务器,用户名: momo 密码 momoko8443)。解压zip文件后,我们从dist文件夹中拷贝几个jar包复制到工程中的lib下。如果你不使用spring管理hibernate,则把hibernate的包也拷上

clip_image008clip_image009

3、修改applicationContext.xml,由于database的增加,所以第一部分代码中的一个dataSource+一个 sessionFactory的配置肯定不能满足多数据库的需求。这里我们要配置2个dataSource和2个sessionFactory。分别来管 理起db1和db2。

由于要使用jta管理事务,dataSource就必须使用实现了javax.sql.XADataSource接口的连接池来连 接,AtomikosTransactionsEssentials为我们提供了一个名为SimpleDataSourceBean的连接池(名字有点 怪),废话不多说了,直接看修改的dataSource和sessionFactory,注意这里的数据库必须是mysql5.0以上,且驱动也要5.0 以上否则不提供XADataSource支持。另外还有个叫Xapool的连接池也是支持xadatasource的,你可以试试看。clip_image010

——————————————————————————————————————————

文件:applicationContext.xml

配置:

<bean id="dataSource1" class="com.atomikos.jdbc.DataSourceBean">

<property name="uniqueResourceName"><value>db1</value></property>

<property name="xaDataSourceClassName"><value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value></property>

<property name="xaDataSourceProperties">

<value>URL=jdbc:mysql://localhost:3306/db1;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="sessionFactory1"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource">

<ref bean="dataSource1" />

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">

org.hibernate.dialect.MySQLDialect

</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>com/zhiku/vo/User1.hbm.xml</value>

</list>

</property>

</bean>

————————————————————————————————————————

第二对连接db2的配置也是一样的,就是把出现1的地方都替换成2

————————————————————————————

文件:applicationContext.xml

配置:

<bean id="dataSource2" class="com.atomikos.jdbc.DataSourceBean">

<property name="uniqueResourceName"><value>db2</value></property>

<property name="xaDataSourceClassName"><value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value></property>

<property name="xaDataSourceProperties">

<value>URL=jdbc:mysql://localhost:3306/db2;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="sessionFactory2"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource">

<ref bean="dataSource2" />

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">

org.hibernate.dialect.MySQLDialect

</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>com/zhiku/vo/User2.hbm.xml</value>

</list>

</property>

</bean>

————————————————————————————————————————————

4、继续修改applicationContext.xml,现在是关键所在,开始添加jta事务管理了。注意看代码了,首先定一个atomikos提供的transactionManagerclip_image011

——————————————————————————————————

文件:applicationContext.xml

配置:

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">

<property name="forceShutdown"><value>true</value></property>

</bean>

————————————————————————————

再定一个atomikos对UserTransaction接口的实现clip_image012

——————————————————————————

文件:applicationContext.xml

配置:

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">

<property name="transactionTimeout"><value>300</value></property>

</bean>

————————————————————————

接着把第一部分中用到的hibernateTransactionManager进行大换血,由于这里不是由spring通过hibernate来 管理事务了,而是由jta管理因此class要换掉。transactionManager和userTransaction接口的具体实现就注入之前声 明的2个bean,

看到这里是不是有点晕?clip_image013,脑子里clip_image014。正常正常,先死记硬背

————————————————————————————

文件:applicationContext.xml

配置:

<bean id="hibernateTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">

<property name="transactionManager">

<ref local="atomikosTransactionManager"/>

</property>

<property name="userTransaction">

<ref local="atomikosUserTransaction"/>

</property>

</bean>

——————————————————————————————

user1DAOImpl和user2DAOImpl的sessionFactory属性稍作修改注入新的sessionFactory。user2DAOImpl类似,这里就不给出代码了。clip_image015

——————————————————————————————

文件:applicationContext.xml

配置:

<bean id="user1DAOImpl" class="com.zhiku.dao.impl.User1DAOImpl">

<property name="sessionFactory">

<ref local="sessionFactory1"/>

</property>

</bean>

————————————————————————————

5、映射文件可以重新生成一下,也可以把User2.hbm.xml中的catalog="db1"改成db2就可以不必重新生成而套用原来的

<class name="com.zhiku.vo.User2" table="user2" catalog="db2">

其他的都不必修改

接下来,run application。看下控制台,很好,正如我们期望的一样,第一次测试时,事务正常提交了。clip_image016

clip_image018

看下数据库,果然,2个db中user表都被“插入”clip_image019一条记录。如下图所示:

clip_image020

clip_image021,不要意思上错图了。如下图所示:

clip_image023

clip_image025

6、按照管理,接下来就是应该测roll back了,好,给它制造困难,把serviceImpl中的“困难”加上。clip_image026 Run application

clip_image028

看一下控制台输出,果然抛出了异常clip_image029

clip_image031

再观察下数据库中的记录。OK!roll back成功!clip_image032

clip_image034

clip_image036

7、至此分布式事务管理demo演示完毕,2个demo都是演示性质的,知侧重于配置和实现,至于其中的原理,由于我能力有限不能表述的很清楚,你可以查看spring的api文档进行探索。clip_image037,谢谢观赏。

分享到:
评论

相关推荐

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

    本示例“第二部分spring+hibernate+jta 分布式事务Demo”将帮助我们理解如何在这三个框架之间协同工作,实现高效且可靠的事务管理。 首先,让我们深入了解一下这三个组件: 1. **Spring**:这是一个全面的Java应用...

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    spring+hibernate+jta demo

    这个DEMO展示了如何在Java Web环境中进行持久层操作,以及如何利用Spring的事务管理能力实现分布式事务的控制。这种整合方式在实际开发中具有很高的实用价值,因为它既保持了代码的清晰性,又提供了强大的事务处理...

    JTA-demo:spring+hibernate+jta+mysql

    总的来说,这个JTA-demo是一个学习和实践Java企业级事务管理的好资源,它演示了Spring、Hibernate和JTA在复杂环境中的协同工作,这对于理解和实现大型分布式系统中的事务处理至关重要。通过深入研究这个示例,开发者...

    spring+hibernate+jtom demo

    在本文中,我们将深入探讨如何使用Spring、Hibernate和JOTM进行分布式事务管理,以实现在一个Service方法中同时操作两个不同数据源的数据,并确保任何错误都能导致所有操作回滚。首先,我们需要了解这些技术的基本...

    Spring+Hibernate+Struts2整合(包含Demo)

    3. **事务管理**:Hibernate支持JTA和JDBC事务,提供事务边界控制。 4. **查询语言HQL**:Hibernate Query Language,类似于SQL,但针对对象而非表格。 再者,Struts2是MVC框架,负责处理HTTP请求并展现视图。它的...

    Eclipse下Spring+SpringMVC+Hibernate框架环境搭建demo

    本教程将详细介绍如何在Eclipse中搭建一个基于Spring、SpringMVC和Hibernate的集成开发环境,为初学者提供一个良好的起点。 首先,我们来了解这三个框架的核心功能: 1. **Spring**:这是一个轻量级的Java企业级...

    JTA_Demo:jta-in-spring

    【JTA_Demo:jta-in-spring】项目是一个典型的Java事务管理示例,它主要展示了如何在Spring框架中集成并使用Java Transaction API (JTA)进行分布式事务处理。在这个项目中,我们将会深入理解JTA的核心概念以及其在...

    HibernateDemo

    6. **事务管理**:Hibernate支持JTA(Java Transaction API)和JDBC事务。在操作数据库时,通常包裹在`Session.beginTransaction()`和`transaction.commit()`之间,以确保数据的一致性。 7. **HQL(Hibernate Query...

    JBPM5入门学习.doc

    - **4.3.4 使用jotm配置tomcat数据源以支持JTA**: 通过Jotm配置Tomcat的数据源,以支持分布式事务。 - **4.3.5 Jbpm相关配置文件更新**: 更新JBPM相关的配置文件,如persistence.xml、jbpm.cfg.xml等。 - **4.3.6 ...

    databasedemo

    Java EE提供了JTA(Java Transaction API)来管理分布式事务,而Spring框架提供了声明式事务管理,可以在配置文件中定义事务边界。 7. **数据库设计**:项目可能包含数据库模型设计,包括实体关系(ER)图、数据表...

    271个java需要用的jar包

    spring-hibernate3-2.0.8.jar spring-jdbc-3.1.1.RELEASE.jar spring-jdbc-4.1.4.RELEASE.jar spring-mock.jar spring-test-3.0.5.RELEASE.jar spring-tx-3.1.1.RELEASE.jar spring-web-3.0.5.RELEASE.jar spring-...

Global site tag (gtag.js) - Google Analytics