跨库事务处理 spring+hibernate+struts2+jta
最近做东西,不想数据太集中,所以将数据分散到多个数据库中,但是往多个数据库中插入数据是在是很痛苦的一件事,因为涉及到事务的一致性问题,比如我把用户和图书的表分开来存,当某个用户存一本书的时候,我必须修改用户的最后更新时间,和书的内容,一旦其中一个更新失败,都需要回滚。
参考了一下spring的文档“事务策略”部分的内容,终于有了点想法:
首先让我们来配置两个数据源:
两个数据库 jtatest1和jtatest2
分别有两个表,jtatest1.product和jtatest2.introduce

-- Table "product" DDL
CREATE TABLE `product` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate utf8_unicode_ci default NULL,
  `introduceId` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- Table "introduce" DDL
CREATE TABLE `introduce` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
<!-- 配置两个数据源 -->
 <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://37.17k.com:3306/jtatest1?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
     <property name="maxActive" value="400"/>
     <property name="maxIdle" value="30"/>
     <property name="maxWait" value="30000"/>
        <!--property name="validationQuery" value="select current_date()"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <property name="testWhileIdle" value="true"/-->
   </bean>
     <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://35.17k.com:3306/jtatest?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
     <property name="maxActive" value="400"/>
     <property name="maxIdle" value="30"/>
     <property name="maxWait" value="30000"/>
        <!--property name="validationQuery" value="select current_date()"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <property name="testWhileIdle" value="true"/-->
   </bean>
   
   <!-- 两个sessionFactory -->
  <bean id="mySessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource" ref="dataSource1"/>
     <property name="mappingResources">
       <list>
         <value>/test/model/product.hbm.xml</value>
       </list>
     </property>
     <property name="hibernateProperties">
        <value>
          hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                hibernate.show_sql=true
        </value>
     </property>
   </bean>
   <bean id="mySessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource" ref="dataSource2"/>
     <property name="mappingResources">
       <list>
         <value>/test/model/Introduce.hbm.xml</value>
       </list>
     </property>
     <property name="hibernateProperties">
        <value>
          hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                hibernate.show_sql=true
        </value>
     </property>
  </bean>
  <!-- 定义两个DAO -->
  <bean id="myProductDao" class="test.dao.myProductDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory1"/>
  </bean>
  <bean id="introduceDao" class="test.dao.introduceDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory2"/>
  </bean>
然后我们来定义事务:
<!-- 事务管理 -->
  <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
  <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager">
   <property name="userTransaction" ref="jotm" />
  </bean>
  <bean id="myService"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="myTxManager"/>
    <property name="target">
      <bean class="test.service.myServiceImpl">
        <property name="myProductDao" ref="myProductDao"/>
        <property name="introduceDao" ref="introduceDao"/>
      </bean>
    </property>
   <property name="transactionAttributes">
   <props>
    <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="excute*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="import*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="publish*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
 </property>
现在可以测试了:

public class test extends HibernateDaoSupport{
private static Log log = LogFactory.getLog(test.class);
 public static void main(String args[]){
  ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
  BeanFactory factory = context;
  product p=new product();
  p.setIntroduceId(1);
  p.setName("鸡肉");
  introduce i=new introduce(); 
  i.setName("大大牌鸡肉"); 
  myService service=(myService)factory.getBean("myService");
/**
这里我测试了两次
service.saveSomthing(p, i);
能够成功保存,
如果使用
service.saveSomthing(p, null);
则两个数据都保存不上
*/
  service.saveSomthing(p, i);
 }
}
附件中为我的示例代码:

转载于:https://blog.51cto.com/huqilong/109109

跨库事务处理 spring+hibernate+struts2+jta相关推荐

  1. 分享十二本经典电子书,涉及java, OO design, spring, hibernate,struts2, agile

    1. thinking in java java developer常见案头书 2. effective java, 2nd Edition 会写代码和写好代码的差距,可以靠这本书缩短.包含JDK1. ...

  2. spring+hibernate+Struts2 整合(全注解及注意事项)

    最近帮同学做毕设,一个物流管理系统,一个点餐系统,用注解开发起来还是很快的,就是刚开始搭环境费了点事,今天把物流管理系统的一部分跟环境都贴出来,有什么不足的,请大神不吝赐教. 1.结构如下 2.jar ...

  3. Spring+Hibernate+Struts2整合所需要的Jar包

    struts2.1.6 支持jar包 xwork-2.1.2.jar struts2-core-2.1.6.jar commons-logging-1.0.4.jar freemarker-2.3.1 ...

  4. Spring+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务

    一.概念 分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.简言之,同时操作多个数据库保持事务的统一,达到跨库事务的效果. JT ...

  5. SpringBoot整合atomikos实现跨库事务

    背景 框架之前完成了多数据源的动态切换及事务的处理,想更近一步提供一个简单的跨库事务处理功能,经过网上的搜索调研,大致有XA事务/SEGA事务/TCC事务等方案,因为业务主要涉及政府及企业且并发量不大 ...

  6. struts2+spring+hibernate

    ---恢复内容开始--- Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sessio ...

  7. java高级框架应用开发案例教程_Java高级框架应用开发案例教程:struts2+spring+hibernate PDF...

    资源名称:Java高级框架应用开发案例教程:struts2+spring+hibernate PDF 第1章 struts+spring+hibernate概述 1.1 框架概述 1.2 struts ...

  8. Struts2,Spring,Hibernate框架的优缺点

    开源是3个框架共有的优点 Struts2框架(MVC框架)的优点如下: 1)  实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现: 2)  丰富的标签库,大大提高了开发的效率: 3) S ...

  9. SSH之IDEA2017整合Struts2+Spring+Hibernate

    摘要 IDEA无疑是Java编程的利器,在下面我们将介绍如何使用IDEA来整合SSH(Struts2 + Spring + Hibernate):介绍將分为三个部分来讲,分别是新建工程,Spring引 ...

最新文章

  1. 论一枚数据科学家的自我修养
  2. jquery-1.11.3.js与jquery-1.11.3.min.js区别
  3. Webpack 4 + React + Typescript 搭建启动模版
  4. python myqr 二维码生成
  5. 推荐一个十分好看的开源博客系统
  6. Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略
  7. spark wordcount完整工程代码(含pom.xml)
  8. mvc html.display,Asp.Net MVC中的Html.DisplayFor()用于项目列表
  9. Javascript eval()函数 基础回顾
  10. Prim算法的C语言程序
  11. IDEA高级玩法:集成JIRA、UML类图插件、SSH、FTP、Database管理...
  12. pppd详解_pppd命令使用详解
  13. EL表达式可以使用indexof方法吗
  14. duplicate复制数据库(rac-单实例)
  15. 本地前后端联调跳过cas sso单点登录
  16. MQ集群(rabbitMQ)
  17. Memory Fusion Network for Multi-view Sequential Learning注意力融合MFN
  18. 变电站巡检机器人工作中有哪些常见问题?该如何解决
  19. (不带头结点的)单链表增删查改,逆置单链表(两种方法),求两个单链表的第一个公共结点,合并两个单链表,单循环链表中判断第一个入环点,约瑟夫环
  20. Apple iWork(Pages、Numbers、Keynote)11.0 发布

热门文章

  1. 在阿里云主机的Debian操作系统上安装Docker
  2. 我的Python成长之路---第三天---Python基础(9)---2016年1月16日(雾霾)
  3. window下用主机名登录MySQL数据库出现报错解决方案
  4. clearTaskOnLaunch的作用,自己总结,求关注
  5. 修改Linux系统默认编辑器
  6. 微信公众号开发之创建菜单栏代码示例(php)
  7. centos7.3二进制安装mariadb10.2.8
  8. 01.Elasticsearch安装
  9. asp.net后台cs 和 JavaScript 互相调用方法
  10. 一个肥皂泡的破灭(组图)