jakarta-ee - @PrePassivate 和 @PostActivate 注释何时有用?

标签 jakarta-ee ejb ejb-passivation

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

最佳答案

大多数时候您使用 有状态 Session Beans(实际上并不推荐,除了一些很少需要的情况)这对于容器在某个时间点管理和重用一些非事件连接很有用,以帮助保持从数据库获取的连接数一些最佳计数。

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

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

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

示例 场景 :

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

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

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

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

希望这会有所帮助。

关于jakarta-ee - @PrePassivate 和 @PostActivate 注释何时有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37222847/

相关文章:

tomcat - CORE3282 : stdout: org. xml.sax.SAXParseException : Document root element "taglib", 必须匹配 DOCTYPE 根 "null"

jakarta-ee - 使用EJB计时器服务

java - 'org.omg.CORBA.MARSHAL: vmcid: 0x0 minor code: 0 completed: Maybe' 是什么意思?

jsf - 为什么我不应该将 JSF SessionScoped bean 用于逻辑?

java - EJB Bean 钝化

java - 制作一个 BrainF*ck 解释器,循环遇到麻烦

maven - maven依赖从哪里获取包?

apache - 无法在 Tomcat 8.0.26 中重新部署 war 文件