0

我有一个 EJB3 应用程序,它包含一些用于访问数据库的 EJB,并通过会话 Bean 作为 Web 服务公开。

现在有两件事我需要找出:

1) 有什么方法可以阻止 SQL 异常导致 Web 服务抛出 SOAP 错误?事务由容器处理,当前 sql 异常会导致引发 RollBackException,因此事务会回滚(期望的行为)并且 Web 服务会引发错误(不期望的)。

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

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

谢谢。

4

2 回答 2

2

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

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

类似于:

public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

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

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

于 2009-03-23T15:23:57.610 回答
0

对于 (1):调试您的代码以找出异常被抛出的位置以及导致它的原因。然后在那里处理异常。

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

for(each Entity){
    try{
        //begin transaction
        //save entity
        //commit
    } catch(Exception e) {
         //handle Exception, but continue on
    }
}
于 2009-03-23T14:26:32.723 回答