我想知道如何为每个用户线程设计实现一个 JPA EntityManager。由于 EM 是轻量级对象,因此为每个用户线程创建它们不应该是开销。我要解决的问题是单个 JSP 页面,其中包含对后端服务的多个(并行)JSON/AJAX 调用(通过控制器)。
我有一个实体管理器(具有扩展的持久性上下文),带有 Open EM In View Filter。它确实工作得很好,但只有当每页有一个用户线程(例如,一个 json 调用)时,或者换句话说,当我以串行方式访问 em 时。然而,当我从多个线程调用我的服务时,它并没有解决我的目的,因为 em 实例是共享的并且我得到了奇怪的错误(有时是对集合的共享访问,有时是关闭连接,我相信这是预期的)。
我在 Spring 3 和 hibernate 3.5 上使用 JPA。我将实体管理器(扩展)注入到我的服务中,如下所示:
@PersistenceContext(type = PersistenceContextType.EXTENDED)
protected EntityManager em;
我的只读服务方法被注释为
<tx:method name="get*" read-only="true" propagation="SUPPORTS"/>
所有其他方法,都注释为
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
我想避免应用程序管理 em,因此没有去注入 EntityManagerFactory。另外,如果我选择将 EntityManager 注入 spring 控制器,当从两个线程并行调用同一个控制器时,我仍然会遇到问题!
有没有一种优雅的方式来实现对 em.xml 的线程安全访问?我还想避免锁定任何实体对象,这会使事情进一步复杂化。
由于来自同一页面的多个 ajax 调用是现代 Web 应用程序中非常常见的设计,我相信必须有一种简单且声明性的方式来实现这一点(无需回到使用拦截器等手动管理休眠会话)