我有一个用于进行几个数据库查询的有状态 bean。我在调用的第一个方法中打开连接,但我只想在 EJB 客户端真正完成有状态 bean 之后关闭连接。我认为我可以将关闭数据库连接的逻辑放在@PreDestroy 方法中。
这似乎有效,但我很好奇其中的含义。具体来说,EJB 会话何时完成?这是容器管理的事务,所以我假设当 EJB 客户端方法完成时,EJB 事务也会完成。具体来说,什么时候调用 PreDestroy 方法?交易还在吗?还是它已经提交并将自己放回池中?谢谢!
我有一个用于进行几个数据库查询的有状态 bean。我在调用的第一个方法中打开连接,但我只想在 EJB 客户端真正完成有状态 bean 之后关闭连接。我认为我可以将关闭数据库连接的逻辑放在@PreDestroy 方法中。
这似乎有效,但我很好奇其中的含义。具体来说,EJB 会话何时完成?这是容器管理的事务,所以我假设当 EJB 客户端方法完成时,EJB 事务也会完成。具体来说,什么时候调用 PreDestroy 方法?交易还在吗?还是它已经提交并将自己放回池中?谢谢!
下面是规范的摘录,它可能会阐明有状态会话 bean 的生命周期。
在生命周期结束时,客户端调用注解为@Remove 的方法,并且EJB 容器调用注解为@PreDestroy 的方法(如果有)。然后 bean 的实例就可以进行垃圾回收了。
在会话 bean 的 PostConstruct 或 PreDestroy 生命周期回调拦截器方法中执行数据库操作并假设这些操作是客户端事务的一部分是错误的。PostConstruct 和 PreDestroy 方法不受事务属性控制,因为在这些方法中处理回滚会使会话实例的状态图变得非常复杂。
PreDestroy 方法在未指定的事务和安全上下文中调用。
PrePassivate 回调通知表明容器要钝化实例的意图。PostActivate 通知通知它刚刚被重新激活的实例。因为容器在有状态会话 bean 实例被钝化时会自动维护它的会话状态,所以大多数会话 bean 不需要这些通知。它们的目的是允许有状态会话 bean 维护那些需要在实例钝化之前关闭然后在实例激活期间重新打开的开放资源。