在 quarkus 的 ApplicationScoped bean 中注入 entitymanager 如何安全?

How is it safe to inject entitymanager in ApplicationScoped bean in quarkus?

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

当您 can see 时,Quarkus 与其他使用 JPA 结构的项目一样,在幕后做了很多工作,以确保您作为最终用户接收到的上下文引用安全且正确地运行.

(免责声明:我不是 Quarkus 专家,但这种根据事务状态、同步相关和其他问题将 EntityManager 操作委托给不同的底层 EntityManager 委托的特殊模式在各个领域都很常见它之前的应用程序服务器也是如此。)

注入所谓的 "container-managed" EntityManager 以人们直觉期望的方式行事是相当棘手的。作为最终用户,您在这方面要小心是正确的:实际上,您从 EntityManagerFactory#createEntityManager() 收到的 EntityManager 不是线程安全的。但这不是注入这些插槽的内容。例如,以这种方式注入的 EntityManagers 会做其他令人兴奋的事情,比如自动参与 JTA 事务,而这些事务本质上是特定于线程的,因此必须保持某种程度的线程安全——等等等等。很明显,这里发生的不仅仅是应用程序管理的简单注入 EntityManager.

要点是:ApplicationScoped bean 接收的 EntityManager 引用是以线程安全的方式提供的。