【问题标题】:EJB Bean is associated with a different unfinished transactionEJB Bean 与不同的未完成事务相关联
【发布时间】:2014-02-04 10:26:04
【问题描述】:

请看这个sn-p:

@Stateless 
public class A {
   @EJB
   B b; // B is stateful EJB

   b.init(); // initialize Sets and List that are used in doSthInB(C c)
   public void doSthInA(){
        for(C c){
           b.doSthInB(c); // doSthInB use REQUIRES_NEW transaction type
        }
   }
}

我的目的是处理 C 类型对象的集合。doSthInB 方法修改实体,结果应该在方法调用结束时持久化(这就是我使用 REQUIRES_NEW 的原因)。 如果在处理输入集合中的某些元素期间发生错误,则不应仅保留此操作,应将其记录下来,并且不应停止其他元素的处理。

我在处理过程中得到的是:javax.ejb.EJBException: java.lang.IllegalStateException: Bean is associated with a different unfinished transaction

也许我的想法是错误的。有什么建议吗?

【问题讨论】:

  • 好吧,我将 Stateful 更改为 Stateless。现在我得到了有趣的异常 NPE。似乎对于我在 b.init() 中初始化的某些迭代集合没有实例化。我在 for 循环中迭代了数百个对象,并且我认为 ejb 容器使用多个 ejb 来处理对 b.doSthInB(c) 的每一次调用。但只有第一个 ejb 调用 b.init() ,这就是我得到 NPE 的原因。我说的对吗?

标签: java transactions ejb stateless-session-bean stateful-session-bean


【解决方案1】:

我看到您在无状态 bean 中注入有状态。 尽管在大多数情况下规范允许这样做,但这是一个错误。

我不知道你是否完全知道这是什么 设计决策意味着。如果不是尽量避免使用这种方法。 我认为这可能是您的异常的原因。

【讨论】:

  • 有趣,我不知道那里有任何设计缺陷。即使在无状态 bean 中,当代码运行时,它也被锁定到从池中获取它的单个线程,所以我不明白为什么将有状态的线程绑定 bean 注入无状态 EJB 会出现问题。除非该线程似乎暗示事务边界存在问题。你知道关于这个主题的任何好的阅读材料吗?
  • 在阅读EJB 3.1 in action时第一次意识到这个问题;关于ejb 3.1 specification 可以提供帮助的异常。还有here 有一个很好的相关答案。
  • 那我会读一读那本书,在我读过的所有关于 EJB 技术的书籍中,这个特别的花絮还没有通过审查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多