Java EJB中@Stateless over@Singleton的实际用例是什么

Java EJB中@Stateless over@Singleton的实际用例是什么,java,singleton,ejb,Java,Singleton,Ejb,如果我正确理解EJB,@Singleton实际上与普通Java中的Singleton相同,也与spring中的Singleton相同->一个实例,每个调用都并发地通过同一个实例。 @无状态声明了一个bean,它可以(但不能)有多个实例,但限制是一个实例中只能有一个调用。到现在为止? 这就是我对servlet编程模型的看法:理论上,servlet容器可以复制servlet的多个副本,实际上我还没有见过任何servlet容器可以这样做。 因此,假设我的代码中没有真正有限的资源,如门、窗或打印机(如果

如果我正确理解EJB,@Singleton实际上与普通Java中的Singleton相同,也与spring中的Singleton相同->一个实例,每个调用都并发地通过同一个实例。 @无状态声明了一个bean,它可以(但不能)有多个实例,但限制是一个实例中只能有一个调用。到现在为止? 这就是我对servlet编程模型的看法:理论上,servlet容器可以复制servlet的多个副本,实际上我还没有见过任何servlet容器可以这样做。 因此,假设我的代码中没有真正有限的资源,如门、窗或打印机(如果我有,我仍然可以用队列和其他东西来解决),那么真正的例子是什么,使用@Stateless比使用@Singleton更有利

问候
Leon

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

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

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

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


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

可以使用多个无状态bean实例来提高吞吐量

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

因此,如果您没有真正的单例,那么就使用无状态bean


如果你有一个“无状态的单身汉”,那就没有区别了。但是,如果你读“singleton”,按照惯例,它有一个特殊的含义(=使用singleton模式必须有一个原因)。

请你进一步解释一下。假设我有一个使用数据库连接的服务。就像一个用户服务。类应该是@Singleton还是@Stateless?如果我用完了slsb池大小会发生什么?换句话说,我实际上想要spring、corba、rmi和servlet在ejb中提供的自然编程模型。哪种注释组合允许我在EJB中实现这一点?;-)我不明白为什么让X线程运行在多个A类实例(无状态)中比让X线程运行在一个B类实例(单实例)中获得更高的吞吐量,除非存在一些锁定问题。单例是否存在锁定问题?如果单例中没有锁定问题,那么为什么选择这种设计模式?这可能会让其他人感到困惑。我已经更新了答案。好的,然后我重新措辞我的问题。显然,其他编程模型(如spring、rmi等)不提供单例和无状态之间的分离,而是使用无状态单例。无状态多对象与无状态单体相比有什么优势?因为需要无状态多对象池显然有一个缺点?如果并发请求多于同一类的无状态对象,会发生什么?请求会等待吗?多个请求是否会通过同一个对象?无状态表示“无会话状态”。但是EJB容器可能会注入不可共享的资源。还有会话上下文。似乎您既没有在无状态SB中使用EJB特性,也没有在单例SB中使用应用程序状态。所以答案是“为什么要使用EJB?”。如果性能是唯一重要的,我会在RFC/RPC的情况下使用普通的RMI/servlet/socket。