【问题标题】:Stateful Bean using @PreDestroy to close database connection使用 @PreDestroy 关闭数据库连接的有状态 Bean
【发布时间】:2013-02-19 03:26:18
【问题描述】:

我有一个有状态的 bean,用于进行几个数据库查询。我在调用的第一个方法中打开连接,但我只想在 EJB 客户端真正完成有状态 bean 之后关闭连接。我认为我可以将关闭数据库连接的逻辑放在@PreDestroy 方法中。

这似乎有效,但我很好奇其中的含义。具体来说,EJB 会话何时完成?这是容器管理的事务,所以我假设当 EJB 客户端方法完成时,EJB 事务也会完成。具体来说,什么时候调用 PreDestroy 方法?交易还在吗?还是它已经提交并将自己放回池中?谢谢!

【问题讨论】:

  • 如果您将无状态 bean 用于数据库查询,您可能应该使用它们。
  • 你是对的。我编写了一个通用 bean,它为每个数据库事务打开和关闭会话。我需要一个不同的分阶段 bean,这样我就可以在方法调用之间保持会话打开。我不希望这个有状态 db bean 的客户端必须记住关闭会话,这就是为什么我对与 b​​ean 相关的事务的生命周期感到好奇。

标签: ejb-3.1


【解决方案1】:

以下是规范的摘录,它可能会阐明全状态会话 bean 生命周期。

  • 在生命周期结束时,客户端调用注解的方法 @Remove,EJB容器调用注解@PreDestroy的方法, 如果有的话。然后 bean 的实例就可以进行垃圾回收了。

  • 在会话中执行数据库操作是错误的 bean 的 PostConstruct 或 PreDestroy 生命周期回调拦截器 方法并假设操作是客户的一部分 交易。 PostConstruct 和 PreDestroy 方法不是 由事务属性控制,因为处理回滚 这些方法会使会话实例的状态变得非常复杂 图。

  • 在未指定的事务和安全上下文中调用 PreDestroy 方法。

  • PrePassivate 回调通知表明容器打算钝化实例。 PostActivate 通知通知它刚刚被重新激活的实例。因为容器在有状态会话 bean 实例被钝化时自动维护它的会话状态,所以大多数会话 bean 不需要这些通知。它们的目的是允许有状态会话 bean 维护那些需要在实例钝化之前关闭然后在实例激活期间重新打开的开放资源。

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2011-10-19
    • 2013-10-16
    相关资源
    最近更新 更多