【发布时间】:2012-06-28 13:57:55
【问题描述】:
只要我想持久化任何实体,就会执行以下代码。事情似乎工作正常,但我不明白它是如何工作的!
EntityManager em = getEntityManager();
EntityTransaction userTransaction = em.getTransaction();
userTransaction.begin();
em.persist( ent );
userTransaction.commit();
上面的 EntityManager 是整个应用程序共享的单个实例。开始交易后;我只是说em.persist(entity).. hibernate怎么知道它属于哪个事务!
假设我的应用程序上有 10 个并发用户,并且所有 10 个线程都在执行上述代码。因此,创建并提交了 10 个独立事务。但是所有 10 个不同的实体我都没有将它们与各自的交易相关联;那么 JPA 是如何解决的呢!
基于答案;我们有以下;我们是说每个线程都应该有一个 EntityManager 实例吗?这不会是服务器上的杀戮!我们应该汇集这些实例吗?难道不等于再次实现某种连接池吗?
【问题讨论】:
-
“哪笔交易”是什么意思?一个新兴市场在任何时候都有一个单一的(本地)交易;它没有多个。跨多个线程共享单个 EM 会导致问题,因为它不能保证是线程安全的。
-
docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/… EntityManagerFactory 是一个创建成本高、线程安全的对象,旨在由所有应用程序线程共享。它创建一次,通常在应用程序启动时创建。 EntityManager 是一个廉价的、非线程安全的对象,应该使用一次,用于单个业务流程、单个工作单元,然后丢弃
-
关于进一步阅读;我的理解是 EntityManager 的创建是轻量级的,但对于我们创建的每个小型数据库操作来说仍然不是很轻。建议的解决方案是根据请求创建 EM。所以,看起来应该是 ThreadLocal 级别的。
-
我了解 EntityManager 不是线程安全的,我们应该为其创建新对象。但是我们是否也需要为 select 查询创建新的 EntityManagers(我们不启动任何事务).. 这不是矫枉过正吗?
-
需要EntityManager操作的时候需要创建EntityManager,如果需要Query那你怎么获取Query呢?
标签: hibernate jpa transactions jpa-2.0