当前位置: 首页 > 面试题库 >

EntityManager在多线程应用程序中?

胡景澄
2023-03-14
问题内容

EntityManager在多线程应用程序中如何使用Hibernate(例如,每个客户端连接在服务器上启动它自己的线程)。

EntityManager应该仅由EntityManagerFactory创建一次,例如:

private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit");
private static EntityManager em = emf.createEntityManager();
    public static EntityManager get() {
        return em;
    }

还是我必须为每个线程以及关闭EM的每个事务重新创建实体?

我的CRUD方法如下所示:

public void save(T entity) {
    em.getTransaction().begin();
    em.persist(entity);
    em.getTransaction().commit();
    em.close();
}

public void delete(T entity) {
    em.getTransaction().begin();
    em.remove(entity);
    em.getTransaction().commit();
    em.close();
}

我要不要emf.createEntityManager()每次都跑.begin()?还是因为每个人都使用自己的缓存创建自己的EntityManager实例而使我陷入麻烦了?


问题答案:

5.1。
实体管理器和交易范围

EntityManager是一种廉价的,非线程安全的对象,应针对单个业务流程,单个工作单元使用一次,然后丢弃。

这完全可以回答您的问题。不要通过线程共享EM。只要一个事务处理是 工作单元的 一部分,就可以对多个事务使用一个EM 。

此外,关闭后无法使用EntityManger

调用close方法后,EntityManager实例上的所有方法以及从该实例获取的任何Query,TypedQuery和StoredProcedureQuery对象都将引发IllegalStateException。

考虑这样的事情:

public class Controller {

    private EntityManagerFactory emf;

    public void doSomeUnitOfWork(int id) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        CrudDao dao = new CrudDao(em);

        Entity entity = dao.get(id);
        entity.setName("James");
        dao.save(entity);

        em.getTransaction.commit();
        em.close();
    }

}


 类似资料:
  • 我正在使用JavaSE7开发一个桌面应用程序。应用程序使用多个线程,在创建的每个线程中,都会注入一个DAO类来访问我的数据库。作为持久层,我使用EclipseLink和JPA。EntityManager是使用构造函数注入注入注入到我的DAO类中的,因为它不是线程安全的,所以我使用了如下验证程序: 然而,相同的EntityManager实例被注入到每个DAO中。为了进行设置,我使用了由guice提供

  • 问题内容: 我有大约10个EntityManager的Java EE应用程序(EM的数量可能会增加)。我的应用程序还包含许多无状态,有状态和消息驱动的bean。 与其将我的EM注入每个Bean (以及两种检测用户使用的EM的方法),不如将所有这些存储在一个singleton bean中,并与其他bean一起访问。这样,无需担心可维护性。 但是,将EM存储在一个单例bean中是否安全?会出现瓶颈吗?

  • 问题内容: 自两年以来,我一直在使用java(Servlets,JSPs)进行Web应用程序开发。在那两年中,我从不需要在任何项目中使用(明确地- 众所周知,servlet容器使用线程为不同的请求提供相同的servlet)。 但是,每当我参加Web开发人员职位(java)的面试时,就会有几个与java中的线程相关的问题。我知道Java线程的基础知识,因此回答问题不是问题。但是有时我会感到困惑,是否

  • 问题内容: 我将python解释器嵌入到多线程C应用程序中,对于应该使用哪些API来确保线程安全,我有些困惑。 从我收集到的信息来看,嵌入python时,在调用任何其他Python C API调用之前,由嵌入器负责GIL锁定。这是通过以下功能完成的: 但是,仅此一项似乎还不够。我仍然遇到随机崩溃,因为它似乎并未为Python API提供互斥。 阅读更多文档后,我还添加了: 在致电之后,但这就是令人

  • 问题内容: 我正在尝试将Hibernate用于多线程应用程序,其中每个线程都检索一个对象并将其插入表中。我的代码如下所示。我每个线程都有本地hibernate会话对象,在每个InsertData中,我都执行beginTransaction和commit。 我面临的问题是很多次我收到“ org.hibernate.TransactionException:不支持嵌套事务” 由于我是hibernate

  • 问题内容: 是否有一种实际的方法可以在PHP中实现多线程模型,无论是真正的还是仅对其进行仿真。一段时间以前,建议您可以强制操作系统加载PHP可执行文件的另一个实例并处理其他同时进行的进程。 这样做的问题是,当PHP代码完成执行PHP实例后,它仍保留在内存中,因为无法从PHP中杀死它。因此,如果您正在模拟多个线程,则可以想象会发生什么。因此,我仍在寻找一种可以在PHP中有效完成或模拟多线程的方法。有