我有一个 EJB,它需要是单例和有状态的,因为它将成为一种连接池。我的问题是:
@Singleton
定义一个 EJB注释,默认情况下它是有状态的还是我必须用 @Stateful
定义它还? @Stateless
一起使用吗?注解? 试图找到一些关于此的文档,但到目前为止还没有运气,所以任何有知识的人请分享你的智慧,也许一两个链接。
最佳答案
EJB tutorials表明 EJB 可以是单例的,也可以是有状态的,也可以是无状态的。我从来没有尝试过使用这些注释中的一个以上,但我相当确信正确的做法是只使用其中一个。
从那个链接:
Singleton session beans maintain their state between client invocations
所以,对于你的问题:
if I define a EJB with @Singleton annotation will it then be stateful by default or do I have to define it with @Stateful also?
如果对于 Stateful,你的意思是保持其状态的能力,答案是:是的,Singleton 默认是有状态的。
请记住,在某些特殊情况下,Singleton 的行为与 Singleton 不同,请阅读 article对这个。通常,如果您在集群之外并避免使用默认构造函数,则不会冒这种风险:您需要始终使用 EJB 的引用,方法是将其注入(inject)另一个 EJB 或 Web 客户端,使用:
@EJB MyEJB myEJB;
最后看看this Java EE 6 教程的一部分,关于 EJB 生命周期,解释了有状态和其他 EJB 之间的主要区别在于容器在其生命周期内被钝化的能力。这种差异是“默认情况下单例是有状态的”语句严格来说不正确的主要原因,但在您的问题的上下文中是正确的。
关于annotations - java EJB中的@Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513709/