在我的应用程序中,我有一个以“SLSB”实现的“工人”池。
我在glassfish-ejb-jar.xml
中定义了一些与池初始化相关的属性,如下所示:
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>Worker</ejb-name>
<jndi-name>Worker</jndi-name>
<bean-pool>
<steady-pool-size>10</steady-pool-size>
<resize-quantity>2</resize-quantity>
<max-pool-size>30</max-pool-size>
<pool-idle-timeout-in-seconds>300</pool-idle-timeout-in-seconds>
</bean-pool>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
实际上游泳池开始并且尺寸正确。
唯一的一点是初始化不会在启动时发生,而是在一段时间后发生。 这实际上给了我一些问题,客户试图使用池但发现它没有初始化。
有没有办法在启动时触发池初始化,或者这完全留给容器?
答案 0 :(得分:2)
问:有没有办法在启动时触发池初始化或这个 完全留给容器?
是。这取决于您使用的Java EE版本:
Java EE 5(EJB 3.0)及更早版本 - 使用启动servlet,即在load-on-startup
配置中将参数web.xml
设置为1的servlet。在该servlet的init
方法中,您将实例化您的Worker bean,一切都将在启动时发生。 servlet配置的一个例子:
<servlet>
<servlet-name>MyStartupServlet></servlet-name>
<servlet-class>your.package.MyStartupServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Java EE 6(EJB 3.1) - 对Singleton bean使用@Startup
注释。来自doc:
EJB容器负责确定何时初始化a 单例会话bean实例,除非是单例会话bean 实现类使用javax.ejb.Startup进行批注 注解。在这种情况下,有时称为急切初始化, EJB容器必须初始化单例会话bean 应用程序启动
答案 1 :(得分:0)
如果我猜这个问题已经解决了。 即使我没有找到任何强制池初始化的方法,我注意到只要需要Pool成员,就会加载整个池。
这听起来确实“懒惰”,即使它实际上不会对我的应用程序的流程造成任何问题,它最终代表性能问题,因为汇集的bean非常重。