@Java EJB 中的单例

问题描述 投票:0回答:1

我有一个 EJB,它需要是单例和有状态的,因为它将成为一种连接池。我的问题是:

  1. 如果我用
    @Singleton
    注释定义一个 EJB,那么它会默认是有状态的还是我还必须用
    @Stateful
    定义它?
  2. 可以用
    @Stateless
    注释吗?

试图找到一些关于这个的文档,但到目前为止没有运气。所以任何有知识的人,请分享你的智慧,也许还有一两个链接。

annotations singleton ejb javabeans
1个回答
14
投票

EJB tutorials 表明 EJB 可以是

Singleton
Stateful
Stateless
。我从未尝试过使用这些注释中的一种以上,但我坚信正确的做法是只使用其中一种。

从那个链接:

单例会话 bean 在客户端之间维护它们的状态 调用

所以,对于你的问题:

如果我用

@Singleton
注释定义一个 EJB,那么它会默认是有状态的,还是我必须也用
@Stateful
定义它?

如果对于 Stateful,您的意思是保持其状态的能力,答案是:是的,Singleton 默认情况下将是 Stateful。

请记住,在某些特定情况下,单身人士的行为并不像单身人士,请阅读这篇 article 关于这一点。通常,如果您在集群之外并避免使用默认构造函数,则不会冒这种风险:您需要始终使用 EJB 的引用,方法是将它注入另一个 EJB 或 Web 客户端,使用:

@EJB MyEJB myEJB;

最后,看看 Java EE 6 教程的this 部分,关于 EJB 的生命周期,解释了有状态和其他 EJB 之间的主要区别在于容器在其生命周期中被钝化的能力。这种差异是声明“默认情况下单例是有状态的”严格来说不正确,但在你的问题的上下文中是正确的主要原因。

© www.soinside.com 2019 - 2024. All rights reserved.