`

对于jboss EJB容器管理事务的问题

    博客分类:
  • Java
阅读更多


学习一下 J2EE 中的两阶段提交事务,并且使用这种方式,而不是开放您自己的事务管理。容器在事务优化方面几乎总是比较好的。

使用容器管理的事务(CMT)提供了两个关键的优势(如果没有容器支持这几乎是不可能的):可组合的工作单元和健壮的事务行为。

如果您的应用程序代码显式地使用了开始和结束事务(也许使用 javax.jts.UserTransaction 或者甚至是本地资源事务),而将来的要求需要组合模块(也许会是代码重构的一部分),这种情况下往往需要改变事务代码。例如,如果模块 A 开始了一个数据库事务,更新数据库,随后提交事务,并且有模块 B 做出同样的处理,请考虑一下当您在模块 C 中尝试使用上述两个模块,会出现什么情况呢?现在,模块 C 正在执行一个逻辑动作,而这个动作实际上将调用两个独立的事务。如果模块 B 在执行中失败了,而模块 A 的事务仍然能被提交。这是我们所不希望出现的行为。如果,相反地,模块 A 和模块 B 都使用 CMT 的话,模块 C 也可以开始一个 CMT(通常通过配置描述符),并且在模块 A 和模块 B 中的事务将是同一个事务的隐含部分,这样就不再需要复杂的重写代码的工作了。

如果您的应用程序在同一个操作中需要访问多种资源,您就要使用两阶段提交事务。例如,如果从 JMS 队列中删除一个消息,并且随后更新基于这条消息的纪录,这时,要保证这两个操作都会执行或都不会执行就变得尤为重要。如果一条消息已经从队列中被删除,而系统没有更新与此消息相关的数据库中的纪录,那么这种系统是不稳定的。一些严重的客户及商业纠纷源自不一致的状态。

我们时常看到一些客户应用程序试图实现他们自己的解决方案。也许会通过应用程序的代码在数据库更新失败的时候 “撤销”对队列的操作。我们不提倡这样做。这种实现要比您最初的想象要复杂得多,并且还有许多其他的情况(想象一下如果应用程序在执行此操作的过程中突然崩溃的情况)。作为替代的方式,应该使用两阶段提交事务。如果您使用 CMT,并且在一个单一的 CMT 中访问两阶段提交的资源(例如 JMS 和大多数数据库),WebSphere 将会处理所有的复杂工作。它将确保整个事务被执行或者都不被执行,包括系统崩溃、数据库崩溃或其他的情况。其实现在事务日志中保存着事务状态。当应用程序访问多种资源的时候,我们怎么强调使用 CMT 事务的必要性都不为过。

引用《EJB设计模式》里的原话,第228页

Always Call setRollbackOnly when
Application Exceptions Occur


An important but unemphasized fact is that application exceptions(developer
written exceptions) thrown from an EJB to client don't trigger automatic
rollbacks of the running transaction,in contrast to EJBExceptions,which auto-
matically trigger the current transaction to roll back.Serious data consistency
problems can arise if a use case fails without the transaction rolling back.
Therefore,always remember to first catch application exceptions and call
ctx.setRollbackOnly() (where ctx is of type javax.ejb.SessionContext
for session beans)before rethrowing or wrapping application exceptions to the
client.
有了这些理论基础,我们就可以方便的搭建这样的系统了:
struts+BusinessDelegate(业务代理)+SLSB(封装业务逻辑)+DAO(数据访问逻辑)

我们都知道,struts实现了MVC中的V和C,对M没有实现,我们需要写一些业务代理(普通java对象)来实现M,所谓的业务代理只不过是隐藏了对SLSB的查找逻辑和一些异常的包装;SLSB封装了业务逻辑,它通过JNDI获取数据源,然后取得连接,然后用数据库连接构造若干DAO并调用起方法,对事物进行管理(例如当DAO抛出SQLException时调用ctx.setRollbackOnly() ,这样保证了数据的完整性)

参考EJB的规范,并不是只要有Exception抛出就可以回滚,而是RuntimeException .

分享到:
评论

相关推荐

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    4.4.1 容器管理事务(CMT) 201 4.4.2 Bean管理事务(BMT) 201 4.5 事务超时设置 201 4.6 本章小结 203 第5章 JNDI和远程方法调用 204 5.1 JNDI的概念 205 5.1.1 命名服务 205 5.1.2 目录服务 206 5.1.3 JNDI的优点 206...

    六大应用服务器用途及简介.docx

    它使您的公司可以开发、部署和整合新一代的电子商务应用,如B2B 电子商务,并支持从简洁的网页内容发布到企业级事务处理的商业应用,含有Jsp和Servlet容器,也就可以做web容器,也包含EJB容器,是完好的J2EE应用服务器 ...

    bmt-example:EAP 上的 BMT 示例

    bmt:Bean 管理事务 - 跨出容器(使用 JPA 和 JTA) 作者:Mike Musgrove 级别:中级技术:EJB、Bean 管理事务 (BMT) 摘要:演示 Bean 管理事务 (BMT) 的 EJB 目标产品:EAP它是什么? 有时,应用程序开发人员需要对...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    JBoss Seam 简介......................................................................................................................................................................... 11 Chapter 1. ...

    超级有影响力霸气的Java面试题大全文档

    EJB容器是EJB组件的代理, EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 24、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不...

    java 面试题 总结

    EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 21、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖...

    java版商城源码下载-dawdler-series:dawdler-series是超高性能:rocket:rpc的一个解决方案,其特点简单、高效(运行,启

    由于公司原因已不再是java语言开发的了),2008年之前采用ejb3.0通过jboss4.x版本进行,2010年采用nio写了一个版本,但容器部分功能未做完整,直到2014年之后开始基于aio重新编写了容器dawdler. dawdler成熟么?基于...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     21.1 多个事务并发运行时的并发问题  21.1.1 第一类丢失更新  21.1.2 脏读  21.1.3 虚读  21.1.4 不可重复读  21.1.5 第二类丢失更新  21.2 数据库系统的锁的基本原理  21.2.1 锁的多粒度性及自动锁升级  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     21.1 多个事务并发运行时的并发问题  21.1.1 第一类丢失更新  21.1.2 脏读  21.1.3 虚读  21.1.4 不可重复读  21.1.5 第二类丢失更新  21.2 数据库系统的锁的基本原理  21.2.1 锁的多粒度性及自动锁升级  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     21.1 多个事务并发运行时的并发问题  21.1.1 第一类丢失更新  21.1.2 脏读  21.1.3 虚读  21.1.4 不可重复读  21.1.5 第二类丢失更新  21.2 数据库系统的锁的基本原理  21.2.1 锁的多粒度性及自动锁升级  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     21.1 多个事务并发运行时的并发问题  21.1.1 第一类丢失更新  21.1.2 脏读  21.1.3 虚读  21.1.4 不可重复读  21.1.5 第二类丢失更新  21.2 数据库系统的锁的基本原理  21.2.1 锁的多粒度性及自动锁升级  ...

    java面试题

    书写EJB要遵循一定的规范,另外要运行EJB,你需要有相应的EJB容器,比如WebLogic、jboss等,而JavaBean不需要,只需要安装Tomcat就可以了。EJB用于服务端的应用开发,而JavaBean用于客户端应用开发。 触发器? 答:...

    java高效学习之路-过来人经验

    Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模...

    JAVA上百实例源码以及开源项目

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    JAVA上百实例源码以及开源项目源代码

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

Global site tag (gtag.js) - Google Analytics