javax.ejb.SessionSynchronization 和 javax.transaction.Synchronization 之间的区别
我正在开发一个主要使用无状态会话 bean (SLSB) 的 EJB3 应用程序。他们使用容器管理事务(CMT)。
我希望 bean 能够了解事务(用于日志记录等)。我可以实现 javax.ejb.SessionSynchronization 来执行此操作。我发现我可以在默认拦截器中注册 javax.transaction.Synchronization 也可以获得类似的回调。
使用其中一种相对于另一种有什么缺点/优点吗?
I am working on an EJB3 application with mainly stateless session beans (SLSB). They use container managed transactions (CMT).
I want the beans to be aware of the transactions (for logging, etc). I can implement the javax.ejb.SessionSynchronization
to do this. I find that I can register a javax.transaction.Synchronization
in a default interceptor also to get similar callbacks.
Are there any dis/advantages to using one over the other?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
同一事务中可以涉及多个相同类型的 SLSB。一旦方法退出,SLSB 就会返回到池中以供下一次调用使用,因此 SLSB 实例“感知”事务是不安全的:在收到通知时,bean 可能会被在另一笔交易中使用。
至于 SFSB,我想说这两种方法理论上没有优势。但是,EJB 容器可能会使用 Synchronization 来执行各种内部任务,因此使用 SessionSynchronization 将允许 EJB 容器更好地控制与其自身操作相关的回调时间。
Multiple SLSB of the same type can be involved in the same transaction. As soon as a method exits, the SLSB is returned to a pool for use by the next invocation, so it is not safe for an SLSB instance to be "aware" of a transaction: by the time it is notified, the bean might be in use in another transaction.
As for SFSB, I would say there is no advantage between the two approaches in theory. However, the EJB container might be using Synchronization for various internal tasks, so using SessionSynchronization would allow the EJB container to have more control over the timing of the callbacks with respect to its own operations.
我只是尝试将 javax.ejb.SessionSynchronization 接口与无状态会话 bean 一起使用,但很困惑没有得到这三个已实现方法的任何调用。然后我在 javax.ejb.SessionSynchronization JavaDoc:
另请参见 这个线程了解更多背景信息。所以我的结论是,使用 CMT 使无状态会话 Bean 具有事务感知功能不能通过 javax.ejb.SessionSynchronization 来实现。
I just tried to use the javax.ejb.SessionSynchronization interface with a stateless session bean and was confused not to get any calls of the three implemented methods. Then I saw this comment in the javax.ejb.SessionSynchronization JavaDoc:
See also this thread for some more background. So my conclusion is that making stateless session beans transaction-aware using CMT can NOT be achieved with javax.ejb.SessionSynchronization.