【问题标题】:How is it safe to inject entitymanager in ApplicationScoped bean in quarkus?在 quarkus 的 ApplicationScoped bean 中注入 entitymanager 是否安全?
【发布时间】:2020-05-21 02:06:49
【问题描述】:

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

【问题讨论】:

    标签: jpa dependency-injection cdi quarkus


    【解决方案1】:

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

    (免责声明:我不是 Quarkus 专家,但这种将 EntityManager 操作委托给不同底层 EntityManager 代表的特殊模式取决于事务状态、同步相关和其他问题,这在之前的应用程序服务器中很常见也是。)

    注入所谓的“容器管理”EntityManagers,其行为方式与人们直观地期望它们的行为方式相当棘手。作为该领域的最终用户,您是正确的:确实,您从EntityManagerFactory#createEntityManager() 收到的EntityManager 不是线程安全的。但这不是注入这些插槽的内容。例如,以这种方式注入的EntityManagers 将执行其他令人兴奋的事情,例如自动参与 JTA 事务,并且这些事务本质上是特定于线程的,因此必须进行某种程度的线程安全——等等向前。显然,这里发生的不仅仅是应用程序管理的EntityManager 的简单注入。

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

    【讨论】:

    • 我认为 Quarkus 世界将重点放在“容器管理”实体管理器上非常重要。仅当您属于/留在托管上下文中时,这才是正确的。例如,如果您在没有任何 @Transactional 注释的情况下将实体管理器注入应用程序范围 bean,并且使用 mutiny 以异步方式调用任何方法,则会遇到一些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2013-03-05
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多