【问题标题】:Injecting stateful bean into stateless将有状态bean注入无状态
【发布时间】:2015-10-08 07:07:36
【问题描述】:

我有 read @Stateful bean (SFSB) 永远不应注入 @Stateless bean (SLSB)。但是实现以下目标的正确方法是什么?

@Stateless
public class FirstEJB
{
    @EJB
    private SecondEJB second;

    public void businessMethod()
    {
        second.businessMethod1();
        second.businessMethod2();
    }
}

second.businessMethod1()second.businessMethod2() 之间应该保留一些状态,所以SecondEJB 不能是无状态的。也没有简单的方法将businessMethod1()businessMethod2() 方法合并为一个,因为SecondEJB 可以有两个以上的业务方法,并且可以以不同的组合方式调用它们。

实际上我已经尝试使SecondEJB 有状态并且它似乎可以工作,但它会导致内存泄漏。没有标有@Remove 注释的SecondEJB 方法,但是我尝试了@StatefulTimeout 却没有运气:创建了很多SecondEJB 实例但没有删除。有人能解释一下为什么会泄漏吗?

【问题讨论】:

    标签: java jakarta-ee ejb stateful-session-bean


    【解决方案1】:

    只是不要使用注射。您可以在调用 buisnessMethod 时使用 bean 的 JNDI 查找,SecondEJB 实例将是在每次方法调用时实例化的方法范围变量。

    【讨论】:

    • 谢谢。但是我仍然不明白为什么使用注入会导致内存泄漏:根据内存分析器,即使明确设置 @StatefulTimeout,我也很少有 FirstEJB 实例(池化?)和很多 SecondEJB
    • 您确定这是内存泄漏,而不仅仅是 gc 行为吗?在那个简单的示例中,我看不到任何可能导致创建大量 sfsb 的内容。原因是不使用 sfsb 注入 slsb 是因为 slsb 被池化和重用,而注入只发生一次,您可以获得已经钝化的 sfsb 或处于意外状态。因此,sfsb 的数量将与 slsb 的数量相同,或者如果 slsb 由于某种原因没有被池化,则更大。
    • 或者可能是您的 sfsb 刚刚被钝化并等待被垃圾收集。很难说,bean 应该什么时候真正被垃圾收集。是因为 sfsb,而不是因为其他代码,同时使用了相同的 sfsb。
    • 帖子中的代码是我真实项目的一个非常简化的版本。它绝对看起来像内存泄漏 - 几天之内数万次。我已将日志记录添加到 @PreDestroy 方法中,直到应用程序取消部署或服务器停止时才调用它。
    • 是的,似乎是泄漏,但你确定,原因在你的slsb? sfsb 可能会在其他地方使用吗?
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多