@PrePassivate和@PostActivate注释何时有用?

时间:2016-05-14 05:15:39

标签: java-ee ejb ejb-passivation

我在每个EJB教程中都看过这个注释,但我不知道它们是如何有用的。什么是我需要的场景?

1 个答案:

答案 0 :(得分:5)

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

例如,您的DBMS可以管理1000个连接。因此,您可以在容器中创建大小为1000的连接池(Application Server,例如GlassFish,Weblogic,...)。

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

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

示例方案

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

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

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

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

希望这会有所帮助。