有状态Bean使用@PreDestroy来关闭数据库连接

时间:2013-02-19 03:26:19

标签: ejb-3.1

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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