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

发布于 2024-11-27 08:16:07 字数 236 浏览 2 评论 0原文

我正在开发一个主要使用无状态会话 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泪之魂 2024-12-04 08:16:07

同一事务中可以涉及多个相同类型的 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.

没有伤那来痛 2024-12-04 08:16:07

我只是尝试将 javax.ejb.SessionSynchronization 接口与无状态会话 bean 一起使用,但很困惑没有得到这三个已实现方法的任何调用。然后我在 javax.ejb.SessionSynchronization JavaDoc

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

另请参见 这个线程了解更多背景信息。所以我的结论是,使用 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:

Only a stateful session bean with container-managed transaction demarcation can receive session synchronization notifications. Other bean types must not implement the SessionSynchronization interface or use the session synchronization annotations.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文