代码之家  ›  专栏  ›  技术社区  ›  user1608137

Stateful Bean使用@PreDestroy关闭数据库连接

  •  0
  • user1608137  · 技术社区  · 11 年前

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

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

    1 回复  |  直到 11 年前
        1
  •  1
  •   Nayan Wadekar    11 年前

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

    • 在生命周期结束时,客户端调用一个带注释的方法 @移除,并且EJB容器调用注释为@PreDestroy的方法, 如果有的话。然后bean实例就可以进行垃圾收集了。

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

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

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