在quarkus中的ApplicationScoped bean中注入实体管理器如何安全?

问题描述 投票:1回答:1

在quarkus示例中,我看到ApplicationScoped bean用作EntityManager注入的服务类。据我所知(JEE)EntityManager不是线程安全的,ApplicationScoped bean也不是。如果将实体管理器注入ApplicationScoped bean,则看起来我们在请求之间共享同一实体管理器。如果ApplicationScoped bean是线程安全的,那么我们只能同时接受一个请求。我不明白为什么我们在EntityManager注入中使用ApplicationScoped而不是RequestScoped Bean。

jpa dependency-injection cdi quarkus
1个回答
0
投票

[与您can see一样,Quarkus与使用JPA构造的其他项目一样,在幕后做了很多工作,以确保您作为最终用户接收的上下文引用的行为安全正确。

[以及。)

注入所谓的“容器管理的” EntityManager,其行为以人们直觉上期望他们的方式是相当棘手的。作为最终用户在这一领域要当心,这是正确的:实际上,从EntityManager收到的EntityManager不是线程安全的。但这不是注入到此类插槽中的内容。例如,以这种方式注入的EntityManager会做其他令人兴奋的事情,例如自动参与JTA事务,而这些事务本质上是特定于线程的,因此必须进行一定程度的线程安全性,依此类推。向前。显然,与简单注入由应用程序管理的EntityManagerFactory#createEntityManager()相比,这里发生的更多。

要点是:EntityManagerFactory#createEntityManager() bean接收到的EntityManager引用以线程安全的方式提供。

© www.soinside.com 2019 - 2024. All rights reserved.