2013-02-19 93 views
0

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

这似乎工作,但我很好奇的影响。具体来说,EJB会话是否完成?这是容器管理的事务,所以我会假设当EJB客户端方法完成时,EJB事务也一样。具体来说,PreDestroy方法是否被调用?交易还在吗?或者它已经提交并重新投入池中?谢谢!

+0

如果你正在使用它们,你应该使用无状态bean是DB查询。 – 2013-02-19 03:29:07

+0

你说得对。我写了一个通用的bean,打开和关闭每个db事务的会话。我需要一个不同的stageful bean,这样我可以在方法调用之间保持会话打开。我不希望这个有状态数据库bean的客户端必须记得关闭会话,这就是为什么我对与bean有关的事务生命周期感到好奇的原因。 – user1608137 2013-02-19 05:00:14

回答

1

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

  • 在生命周期结束时,将客户端调用注释 @Remove的方法,和EJB容器调用该方法注解@PreDestroy, 如果有的话。然后,该bean的实例已准备好进行垃圾收集。

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

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

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

相关问题