English 中文(简体)
EJB3-处理回滚异常
原标题:
  • 时间:2009-03-23 14:17:23
  •  标签:

我有一个EJB3应用程序,它由一些用于访问DB的EJB组成,并通过会话Bean作为web服务公开。

现在我需要了解两件事:

1) 有什么方法可以阻止SQL异常导致web服务抛出SOAP错误吗?事务由容器处理,当前sql异常会导致抛出RollBackException,从而回滚事务(所需行为)和web服务抛出错误(不需要)。

2) 我希望扩展Web服务,使其能够接收实体列表,并将会话bean持久化。然而,我希望每个实体都在自己的事务中执行,这样,如果一个实体失败,其他实体就不会受到影响(同样,web服务也不应该出错)。

对于(1),我试图捕获RollBackException,但我认为这是在另一个线程上的某个地方抛出的,因为从未到达catch块。我认为对于(2),我需要研究用户事务,但首先我更喜欢容器来管理它,其次我不知道如何强制使用用户事务。

谢谢

最佳回答

不,您可以使用容器管理的事务来完成所有这些操作(这肯定是更可取的,因为管理事务很痛苦)。

该解决方案的要点是创建第二个EJB,该EJB仅具有本地接口和所需的事务语义。然后,web服务直接调用的“公共”ejb通过其本地接口调用第二个ejb来完成实际工作。

大致如下:

public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

  public void doSomething() {
    try {
      impl.doSomething();
    } catch(TXRolledBack) {
      // handle rollback ...
    }
  }
}

我知道这看起来有点难看,但相信我,这比直接操纵交易要好得多。

问题回答

For(1):调试代码,找出异常被抛出的位置和原因。然后在那里处理异常。

For(2):用beginTransaction()和commit()包装每个实例。

for(each Entity){
    try{
        //begin transaction
        //save entity
        //commit
    } catch(Exception e) {
         //handle Exception, but continue on
    }
}




相关问题
热门标签