2

在我的应用程序中,我有一个实现为 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>

实际上游泳池开始并且尺寸正确。

唯一的一点是初始化不会在启动时发生,而是在一段时间后发生。这实际上给我一些尝试使用池但发现它未初始化的客户的问题。

有没有办法在启动时触发池初始化,或者这完全留给容器?

4

2 回答 2

2

问:有什么方法可以在启动时触发池初始化或者这完全留给容器?

是的。这取决于您使用的 Java EE 版本:

Java EE 5 (EJB 3.0) 和更早版本- 使用启动 servlet,即load-on-startup在配置中将参数设置为 1 的servlet web.xml。在该initservlet 的方法中,您将实例化您的 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) -@Startup对 Singleton bean 使用注解。从文档

EJB 容器负责确定何时初始化单例会话 bean 实例,除非单例会话 bean 实现类使用 javax.ejb.Startup 注释进行注释。在这种情况下,有时称为急切初始化,EJB 容器必须在应用程序启动时初始化单例会话 bean

于 2012-11-21T15:27:14.243 回答
0

如果我猜这个问题已经解决了。即使我没有找到任何强制池初始化的方法,我注意到只要需要池成员,就会加载整个池。

这听起来绝对“懒惰”,即使它实际上不会对我的应用程序流程造成任何问题,但它确实代表了一个性能问题,因为池化的 bean 非常重。

于 2012-11-07T15:50:09.120 回答