【问题标题】:Injecting EntityManager in servlet, it seems not thread safe在servlet中注入EntityManager,似乎不是线程安全的
【发布时间】:2015-08-05 09:29:09
【问题描述】:

我想在 Java EE 中制作一个登录应用程序。我想为用户使用一个 html 页面、一个 servlet 和一个实体类来实现它,但似乎 EntityManager 不是线程安全的(不能注入到 servlet 中,我需要它来检查数据库)。

我阅读了有关EntityManagerFactory 的信息,但是当我可以让容器执行此操作时,我不想管理生成的EntityManager 的生命周期。我认为可以使用 DAO 模式进行一些实现,以便我可以在 servlet 中拥有一个实体管理器,例如包含管理器的 DAOImpl,并将该类作为 servlet 中的私有变量。但是我在网上找不到任何有用的教程。

有人可以为此提供一个实现吗?

【问题讨论】:

  • 只有具有可变状态的对象才能是非线程安全的。那么为什么不使用无状态对象执行您的身份验证。这不是@Stateless Session Bean 的用途(EJB 3.0 的一部分)吗?
  • 你到底是如何注入它的,这让你认为它不是线程安全的?

标签: jakarta-ee servlets jpa dependency-injection entitymanager


【解决方案1】:

要走的路是将 LoginService 创建为@Stateless。它应该包含 EntityManager。这个 EJB 关注点是管理登录。

现在将 EJB 注入您的 servlet。

容器会处理并发问题。

http://www.adam-bien.com/roller/abien/entry/is_in_an_ejb_injected

【讨论】:

【解决方案2】:

遵循 Oracle 建议的文档here,任何方法都应该这样做: 要么:

通过 SerlvetContextListener 在你的 dao impl 中注入 EntityManagerFactory。

 @PersistenceUnit        
 private EntityManagerFactory emf;

或者在你的 DaoImpl 中注入 EntityManager。

@PersistenceContext
    private EntityManager em;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2019-01-05
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多