@PrePassivate 和@PostActivate 注解什么时候有用?

When are @PrePassivate and @PostActivate annotations useful?

我在每个 EJB 教程中都看到了 @PrePassivate and @PostActivate 注释,但我不明白它们有什么用。什么情况下我需要这些?

大多数情况下,当您使用 有状态 会话 Bean(实际上不推荐这样做,除了一些很少需要的情况)这对于容器管理和管理很有用在某个时间点重新使用一些不活动的连接,以帮助将从数据库中获取的连接数保持在最佳数量。

例如,您的 DBMS 可以管理 1000 个连接。因此,您可以在容器中创建一个大小为 1000 的连接池(应用程序服务器,例如 GlassFish、Weblogic 等)。

然后当您的应用程序达到 1000 个会话的数量时,如果另一个用户想要进入您的应用程序,he/she 应该等到 1000 个连接中的一个被释放。

在这种情况下,Passivate/Activate 的机制可能会有用。很明显 Passivate/Activate 不会在小型应用程序中发生。但是对于一些具有大量并发用户的频繁使用的应用程序,由于池大小、非活动超时和其他一些参数,这可能会发生。

示例场景

可能 1000 个连接中至少有 200 个被用于一些具有很多字段的大表单中的一些数据输入。因此用户可能至少需要 2 或 3 分钟来完成数据输入。在这 3 分钟内,专用于有状态会话 bean 的连接处于非活动状态,可用于其他用户(其他会话 bean)。

因此,在指定的超时后,容器将 passivate 会话 bean 的当前状态(将它们序列化到特定的数据库或文件或内存)并释放其与要使用的连接池的连接。

当用户完成表单并单击提交按钮时,容器将重新分配池中的连接(如果可用)和 activate 该会话 bean 的先前钝化状态以继续业务钝化前的确切状态。

因此,如果您需要在该事件中进行一些手动操作,@PrePassivate@PostActivate 对您很有用。

希望这会有所帮助。