无状态会话Bean与Singleton会话Bean

dea*_*mon 27 java singleton ejb stateless ejb-3.0

Java EE 6教程说:

要提高性能,您可以选择无状态会话bean,如果它具有以下任何特征:

  • bean的状态没有特定客户端的数据.
  • 在单个方法调用中,bean为所有客户端执行通用任务.例如,您可以使用无状态会话bean发送确认在线订单的电子邮件.
  • bean实现了一个Web服务.

单例会话bean适用于以下情况:

  • 状态需要在整个应用程序中共享.
  • 单个企业bean需要同时由多个线程访问.
  • 应用程序需要企业bean在应用程序启动和关闭时执行任务.
  • bean实现了一个Web服务.

但是如果使用什么:

  • 不需要在整个应用程序中共享状态
  • 单个企业bean可以由多个线程同时访问
  • 不需要执行启动或击落任务

比如说我有一个具有以下界面的登录服务:

public interface LoginService {
  boolean authenticate(String user, String password);
}
Run Code Online (Sandbox Code Playgroud)

它应该用@Singleton或@Stateless注释吗?这一个和另一个有什么好处?如果LoginService需要注入一个EntityManager(可以同时使用),该怎么办?

另外:我正在考虑Spring服务bean的Java EE对应物,它们是无状态单例.如果我理解正确,Java EE对应的是@Stateless会话bean,并且@Singleton Beans用于在启动时配置应用程序或在关机时清理或保存应用程序范围的对象.它是否正确?

mjn*_*mjn 13

我会选择无状态 - 服务器可以生成bean的许多实例并并行处理传入的请求.

Singleton听起来像是一个潜在的瓶颈 - 默认的@Lock值是@Lock(WRITE),但可以更改为@Lock(READ)用于bean或单个方法.

  • 你能解释一下,如果我们可以将@Lock(LockType.READ)用于所有类,你为什么认为单例是一个瓶颈?例如@Lock(LockType.READ)公共类MySingleton {..}. (3认同)
  • 我想知道这是否真的是无状态的一个_缺点_,mjn。对于无状态,我们是否需要一个大小为 N 的池来服务 N 个并发请求?据推测,带有 @Lock(READ) 的 Singleton 可以在不调整池大小的情况下服务 N 个并发请求。 (2认同)