`

对于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 .

分享到:
评论

相关推荐

    jboss ejb 3.zip

    1. **容器管理的事务(CMT)**:JBoss EJB 3.0支持自动的事务管理,开发者无需显式处理事务边界。 2. **容器管理的生命周期(CMB)**:管理Bean的创建、初始化、激活、钝化、销毁等生命周期事件。 3. **安全性**:...

    EJB3-JBOSS7-分布式事务示例

    4. **容器管理的事务**:EJB3支持自动事务管理,可以通过`@TransactionAttribute`来定义事务的传播行为和隔离级别。 **JBoss AS7 (现为WildFly)** 是一个开源的应用服务器,它是EJB3规范的一个实现,提供了运行和...

    JBoss EJB3.0实例教程

    它提供了完整的EJB容器,可以管理和部署EJB组件。开发者可以通过JBoss AS(Application Server)或者后来的WildFly来运行和调试EJB应用程序。 通过《JBoss EJB3.0实例教程》这本书,读者可以深入理解EJB3.0的各种...

    JBoss+Ejb

    在Java EE中,EJB提供了一种规范化的模型来创建服务器端业务逻辑,它负责处理并发、事务、安全性和持久性等复杂问题,使得开发者可以专注于业务逻辑的实现。EJB主要有三种类型:会话Bean(Session Beans)、实体Bean...

    jboss+myeclipse+ejb案例

    JBoss提供了部署和管理EJB容器的功能,使得开发者可以在不关心底层复杂性的情况下,专注于编写业务逻辑。 MyEclipse是一款集成开发环境(IDE),特别针对Java EE应用开发进行了优化,支持多种Java EE技术,包括EJB...

    EJB3.0标准技术手册与JBoss实践指南第5版.rar

    5. **容器管理事务**:EJB容器负责事务的管理,开发者只需专注于业务逻辑,无需关心事务的开始、提交或回滚。 6. **安全性**:EJB提供了内置的安全机制,包括角色基线访问控制(Role-Based Access Control, RBAC)...

    JBoss7.1下EJB入门范例代码

    EJB 具有容器管理的事务、安全性、生命周期和并发性等特性,使得开发者可以专注于业务逻辑,而不用关心底层基础设施的细节。 `PersonEJB_Stub.jar` 文件则可能包含 EJB 的远程调用所需的 stub 对象。在分布式环境中...

    jboss EJB3.0实例教程

    8. **事务管理**:EJB容器自动处理事务,开发者无需关心事务的开始、提交、回滚等细节。 【EJB3.0开发实践】 在JBoss应用服务器中部署和运行EJB3.0应用通常涉及以下步骤: 1. **创建EJB项目**:使用IDE如Eclipse...

    Jboss EJB3.0教程

    - 介绍如何在JBoss内置的Web容器中创建Web应用程序来调用EJB组件。 #### 三、基础知识学习 - **熟悉JBoss目录结构**: - 分析JBoss的目录结构及其组成部分的功能。 - 例如:`bin`目录用于存放可执行脚本,`...

    jboss 测试EJB 的例子

    3. **EJB容器管理**:JBoss作为EJB容器,负责EJB的实例化、事务管理、安全性、资源注入和性能优化等。开发者只需关注业务逻辑,无需关心底层实现。 4. **EJB部署**:ejb_demo.jar可能是包含EJB组件的部署单元,通过...

    Jboss下hibernate整合EJB

    - 在EJB中,由于事务管理通常由容器自动处理,因此需要理解EJB的事务边界,并合理设置Hibernate的事务管理策略。 - 注意线程安全问题,尤其是在使用`@Stateful`会话Bean时,需要考虑并发访问对Session的影响。 总结...

    jboss下部署ejb详细步骤

    本文将深入探讨在JBoss应用服务器上部署EJB的详细步骤,这对于理解Java EE架构和进行实际开发至关重要。 一、EJB简介 EJB是Java EE规范的一部分,它提供了一种标准的方式来实现业务逻辑,分为三种主要类型:会话...

    MyEclipse+JBoss开发EJB.doc

    EJB提供了一种标准的方式来实现业务逻辑,使得开发者可以专注于业务处理,而无需关心底层的事务管理、安全性以及资源分配等复杂问题。 MyEclipse是一款基于Eclipse的集成开发环境,尤其适合Java EE项目开发。它提供...

    jboss-4.2.3.GA-jdk6的EJB服务器

    JBoss EJB服务器提供强大的事务管理能力,包括容器管理的事务(CMT),允许开发者通过声明式方式处理事务,无需编写复杂的事务控制代码。开发者只需在方法上添加适当的注解,如`@TransactionAttribute...

    J2Ee Jboss Ejb With Eclipse 2003.rar

    JBoss是一个开源的应用服务器,它完全实现了J2EE规范,包括EJB容器。在2003年,JBoss已经成为开发者首选的J2EE应用服务器之一,因为它免费、性能优异且易于部署。使用JBoss,开发者可以直接在服务器上部署EJB,实现...

    Eclipse+Jboss EJB技术 会话Bean

    此外,理解EJB容器如何处理事务、安全性、性能优化等也是关键部分。 总之,这个实验旨在让你熟悉Eclipse与JBoss的集成,以及如何在Java EE环境中创建和使用会话Bean。通过实践这个简单的“Hello, World”例子,你...

    Jboss下EJB3实例教程

    - 容器管理的事务:EJB3.0支持声明式事务管理,开发者只需在接口或方法上添加@TransactionAttribute注解即可。 2. **Jboss与EJB3.0**: - JBoss AS (Application Server) 是一个开源的应用服务器,完全支持EJB3.0...

Global site tag (gtag.js) - Google Analytics