我在每个 EJB 教程中都看到了@PrePassivate
和@PostActivate
注释,但我看不出它们有什么用处。我需要这些的场景是什么?
1 回答
大多数情况下,当您使用Stateful Session Beans 时(实际上不建议这样做,除了一些很少需要的情况),这对于容器在某个时间点管理和重用一些非活动连接很有用,以帮助保持以某个最佳计数从数据库中获取的连接数。
例如,您的 DBMS 可以管理 1000 个连接。因此,您可以在容器中创建一个大小为 1000 的连接池(应用程序服务器,例如 GlassFish、Weblogic,...)。
然后,当您的应用程序达到 1000 个会话的数量时,例如,如果另一个用户想要进入您的应用程序,他/她应该等到 1000 个连接中的一个被释放。
在这种情况下,一种机制Passivate/Activate
可能是有用的。很明显Passivate/Activate
,小型应用程序中并没有发生。但是对于一些具有大量并发用户的高度使用的应用程序,这可能是由于池大小、非活动超时和其他一些参数而发生的。
示例场景:
可能至少有 1000 个连接中的 200 个用于某些具有很多字段的大型表单中的某些数据输入。因此用户可能至少需要 2 或 3 分钟来完成数据输入。在这 3 分钟内,专用于有状态会话 bean 的连接处于非活动状态,可用于其他用户(其他会话 bean)。
因此,在指定的超时时间后,容器将会话passivate
bean 的当前状态(将它们序列化到特定的数据库或文件或内存)并释放其与要使用的连接池的连接。
当用户完成表单并单击提交按钮时,容器将从池中重新分配连接(如果可用)以及 activate
该会话 bean 的先前钝化状态,以从钝化之前的确切状态继续业务。
因此@PrePassivate
,@PostActivate
如果您需要在该事件中进行一些手动操作,这对您很有用。
希望这会有所帮助。