我在每个EJB教程中都看过这个注释,但我不知道它们是如何有用的。什么是我需要的场景?
答案 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
对您有用。
希望这会有所帮助。