`
ry.china
  • 浏览: 140960 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Spring 里JMS和DB的事务集成

阅读更多

 

http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=1

http://blog.csdn.net/yanical/article/details/4545081原文拷贝

 

不过有点长,我现在都差不都忘了里面讲的内容了。注意评论,里面提到文章讲的内容有些是错误的。

Spring里,如果同时存在JMS操作和DB操作,大概也就三种方式:

1.没有使用JTA。JMS不在事务中,DB操作在事务中   

     a,消息处理

     b,开始数据库事务

     c,数据库操作

     d,数据库提交

         成功:结束

         失败:回到b重试

这种方式事务没有集成,靠的纯粹是我们程序的控制,如果最终数据库提交都没成功的话,可以记下log,再人工去纠正数据。例子里把数据库操作放在了更重要的位置,其实也可以倒过来,让数据库操作先完成,只好在做jms操作,看业务需求了:

     a,开始数据库事务

     b,数据库操作

     c,数据库提交

     d,消息处理

         成功:结束

         失败:回到d重试

我们只要把spring配置改成

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
...
<!-- This is important... -->
<property name="sessionTransacted" value="false" />
</bean> 
再加上自己程序控制就好了。

2.如果没有使用JTA,对于上面的配置如果把属性 sessionTransacted 设成true的话,就产生了第二种方式,过程:

    a,开始jms事务

    b,开始数据库事务

    c,数据库和jms操作

    d,提交数据库操作

    e,提交jms操作

a,b的顺序不肯定,不过对程序没影响,但是d,e的顺序是确定的。在Spring里,数据库会在spring的commit方法里提交,而JMS会在afterCommit方法里提交。如果数据库失败,JMS当然也就回滚了,但是如果数据库成功而JMS失败,就产生了数据不一致,就要加上其它措施。而且这里还有一个致命缺点,就是某些情况下即使JMS失败(比如JMS服务器down了),Spring也不会抛出异常,程序外部以为一切正常,而事实上以产生了不一致问题,而且很难发现。

3.如果使用了JTA那么把属性 sessionTransacted 设成true的话,

JMS和数据库操作就在同一个事务里了,没什么好说,最安全的方式,但是效率很低。

分享到:
评论

相关推荐

    jbpm4整合struts2+spring2.5+hibernate3.3

    在这个整合中,jbpm4需要与Struts2、Spring2.5和Hibernate3.3协同工作,实现流程定义、流程实例管理、事务控制和数据持久化。首先,jbpm4本身拥有一个IOC容器,但为了更好地整合其他框架,通常会选择Spring作为统一...

    springMVC+spring+ibatis

    在与 Spring MVC 集成时,Spring 可以管理 MVC 组件的生命周期,实现业务逻辑和展示层的解耦。 iBATIS 是一个持久层框架,它允许开发者将 SQL 查询映射到 Java 对象,减少了手动编写 JDBC 代码的工作量。iBATIS ...

    spring+springmvc+mybatis+mongodb+ActiveMQ+CXF

    MyBatis与Spring整合后,可以实现事务管理和服务层的无缝集成。 MongoDB是一款非关系型数据库(NoSQL),适用于处理大规模数据分布式存储。它支持JSON格式的数据存储,具有高性能、高可用性和自动分片的能力,适合...

    AtomikosTransactions jar 包

    9. **集成友好**:Atomikos Transactions jar 可以无缝集成到Spring、EJB等企业级框架中,提供事务管理服务。此外,它还提供了与多种中间件和数据库的适配器,如Oracle、MySQL、IBM DB2等,简化了开发过程。 10. **...

    Java相关技术-Java教程.pdf

    借助JavaIDL,Java应用可以更容易地集成和利用企业环境中现有的异构信息资源。 5. JNDI(Java Naming and Directory Interface) JNDI提供了一个统一的接口,用以访问不同命名和目录服务,例如DNS、LDAP等。它为...

    Activiti工作流

    Activiti采用Spring框架作为其底层框架,这意味着它支持Spring的依赖注入和声明式事务管理等功能,因此开发者可以轻松地在项目中整合Activiti,并利用Spring的特性。 在Activiti中,流程定义通常使用XML文件进行...

    SOA通用架构.docx

    这种架构允许不同系统间的组件协同工作,促进业务流程的集成和优化。 在SOA通用架构中,我们通常会涉及到以下几个关键组成部分: 1. **操作系统**:支持SOA架构的操作系统包括Windows、Linux和Unix。这些系统提供...

Global site tag (gtag.js) - Google Analytics