gpt4 book ai didi

multithreading - @Stateless 或 @Singleton 而不是静态助手类?

转载 作者:行者123 更新时间:2023-12-03 12:43:56 27 4
gpt4 key购买 nike

我正在维护一些运行良好的旧 JEE 代码,但正在使用一些静态帮助器类,其中实体管理器从调用 EJB 的方法中传递,如下所示:

public class StaticHelper {

public static void helpingOut(EntityManager entityManager, String value) {
// i.e. insert value
}
}

由于这似乎不太适合 JEE 并且不适合进行单元测试,因此我已将这些帮助程序转换为 @Stateless像这样的 EJB:
@Stateless
public class StatelessHelper {

@PersistenceContext(unitName="SuperUnit")
private EntityManager entityManager;

public void helpingOut(String value) {
// i.e. insert value
}
}

像这样,我可以使用 CDI-Unit 在调用 EJB 中注入(inject)一个模拟助手。 .

现在,根据负载,容器创建了 1-3 个无状态助手实例,我想说这根本不是问题,但无论如何我想到了 @Singleton使用 @ConcurrencyManagement(ConcurrencyManagementType.BEAN)@Lock(LockType.READ)使其成为多线程的——但这似乎不是一个好主意,因为 EntityManager不是线程安全的。或者这样做 explained here还申请吗?

"...The container serializes calls to each stateful and stateless session bean instance. Most containers will support many instances of a session bean executing concurrently; however, each instance sees only a serialized sequence of method calls. Therefore, a stateful or stateless session bean does not have to be coded as reentrant..."

最佳答案

Java EE(或更新的 Jakarta EE)中的业务方法应该在 @Stateless 中实现 bean 。这就是他们的目的。因此,您刚才描述的方法完全适合 Java EE 范式。@Singleton s 用于包含应用程序范围状态的实例。@Singleton对于包含业务方法的 bean,是来自其他技术的模型,例如 Spring 或 Guice。在那些中,业务方法是不同步的,因此您必须注意每个类级别的属性必须是线程安全的。这不是 Java EE 模型,其中一个线程被保证在任何特定时间(根据规范)访问一个 session Bean 的实例,这就是它可以安全地与 EntityManager 一起使用的原因。 .@Singletons 不会发生这种情况,因此,要同时使用它们,您必须使用 @ConcurrencyManagement 调整它们。注释。
你刚才做的刚刚好。
澄清
看起来我说过 Singleton Session Beans 不是线程安全的。我要说的是,默认情况下不允许并发访问单个实例(在 Spring 或 Guice 中相反),因此它们可能成为业务方法的瓶颈。要允许并发访问,您必须使用上述 @ConcurrencyManagement 调整它们。 .

关于multithreading - @Stateless 或 @Singleton 而不是静态助手类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655330/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com