在EJB中@Eingleton上@Stateless的实际用例是什么?

时间:2013-06-14 19:02:04

标签: java singleton ejb

如果我正确理解EJB,@ Singleton实际上与普通Java中的Singleton相同,而且在spring中也是单例 - >一个实例,每个调用同时经历同一个实例。 @Stateless声明一个bean,它可以(但不能)有多个实例,但有一个限制,即同时只有一个调用可以在一个实例中。对吗? 这仍然是我的servlet编程模型:理论上,servlet容器允许创建servlet的多个副本,实际上我还没有看到任何servlet容器这样做。 所以假设我的代码中没有真正有限的资源,比如门,窗口或打印机(如果我这样做,我仍然可以用队列和东西解决它),那么真实的例子是什么,@ Stateless的使用优于使用@Singleton。

问候 莱昂

2 个答案:

答案 0 :(得分:0)

无状态意味着bean是线程安全的。这是因为bean中没有依赖于状态的代码。这意味着运行它的任何方法都不会影响所述方法的未来运行。

无状态类的一个例子是一个进行加法和减法的类。所有必要的参数都传递给方法。执行加法或减法不会改变这些方法在以后调用时的工作方式。这意味着您不必担心类的并发性。

单例通常用于创建非常昂贵的类,例如数据库连接。您不希望每个类在每次需要使用数据库时都创建新的数据库连接,因此您可以在程序启动时将其实例化一次。作为一个单例并不一定意味着该类是线程安全的(尽管它绝对应该是)。

所以无状态意味着这个类是线程安全的。

Singleton指的是这个类只创建一次。虽然这很大程度上意味着该类是(并且它应该是)线程安全的,但它并不直接暗示它像无状态一样。

答案 1 :(得分:0)

您可以拥有多个无状态bean实例来提高吞吐量。

另一方面,只有一个单身实例。这样做的原因通常是在应用程序范围内共享状态,序列化对资源的访问等,这意味着锁定或同步。

因此,如果您没有真正拥有单身人士,那么请使用无状态bean。

如果你有一个“无国籍单身人士”,那就没有区别了。但是如果你读“单身”,它按惯例有特殊含义(=必须有使用单身模式的理由)。