4

我在每个 EJB 教程中都看到了@PrePassivate@PostActivate注释,但我看不出它们有什么用处。我需要这些的场景是什么?

4

1 回答 1

6

大多数情况下,当您使用Stateful Session Beans 时(实际上不建议这样做,除了一些很少需要的情况),这对于容器在某个时间点管理和重用一些非活动连接很有用,以帮助保持以某个最佳计数从数据库中获取的连接数。

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

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

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

示例场景

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

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

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

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

希望这会有所帮助。

于 2016-05-14T05:45:36.050 回答