javax.ejb.SessionSynchronization和javax.transaction.Synchronization之间的区别

时间:2011-08-02 19:48:31

标签: java transactions ejb ejb-3.0

我正在研究一个主要使用无状态会话bean的EJB3应用程序。他们使用容器管理的交易。

我希望bean知道事务(用于记录等)。我可以实现javax.ejb.SessionSynchronization来执行此操作。我发现我可以在默认拦截器中注册javax.transaction.Synchronization来获得类似的回调。

使用其中一个是否有任何不利/优势? 感谢

2 个答案:

答案 0 :(得分:3)

同一类型的多个SLSB可以包含在同一个事务中。一旦方法退出,SLSB就会返回到池以供下次调用使用,因此SLSB实例“知道”事务是不安全的:当通知它时,bean可能是在另一笔交易中使用。

至于SFSB,我认为这两种方法在理论上没有优势。但是,EJB容器可能正在为各种内部任务使用Synchronization,因此使用SessionSynchronization将允许EJB容器更多地控制回调与其自身操作的时间。

答案 1 :(得分:2)

我只是尝试将javax.ejb.SessionSynchronization接口与无状态会话bean一起使用,并且不知道是否获得了对这三种已实现方法的任何调用。然后我在javax.ejb.SessionSynchronization JavaDoc

中看到了这条评论
  

只有具有容器管理的事务划分的有状态会话Bean才能接收会话同步通知。其他bean类型不得实现SessionSynchronization接口或使用会话同步注释。

另请参阅this主题以获取更多背景信息。所以我的结论是使用CMT使无状态会话bean事务感知无法通过javax.ejb.SessionSynchronization实现。