javascript
java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...
我們使用Hibernate(使用JPA)和Hibernate Envers來持久化對象的歷史. Web應用程序運行許多線程,其中一些是通過其他應用程序的RMI方法調用創建的,其中一些是由應用程序本身創建的,其中一些是為處理http請求而創建的(它們生成視圖).
我們還使用Open Session In View模式來管理會話,因此我們的web.xml包含:
openEntityManagerInViewFilter
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
openEntityManagerInViewFilter
/*
使用DAO訪問數據庫,所有這些都有Spring注入的EntityManagers.
@PersistenceContext
protected EntityManager em;
@PersistenceUnit
protected EntityManagerFactory emf;
在我們決定使用Hibernate Envers之前,一切都運行良好.當任何不是視圖生成線程的線程運行代碼以獲取舊版本的對象時,拋出異常.
@Override
public O loadByRevision(Long revision, Long id) {
@SuppressWarnings("unchecked")
O object = (O) AuditReaderFactory.get(em).createQuery().forEntitiesAtRevision(getBaseClass(), revision.intValue())
.add(AuditEntity.id().eq(id)).getSingleResult();
return object;
}
Exception in thread “Scheduler” org.hibernate.SessionException:
Session is closed! at
org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129)
at
org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1776)
at
org.hibernate.envers.tools.query.QueryBuilder.toQuery(QueryBuilder.java:226)
at
org.hibernate.envers.query.impl.AbstractAuditQuery.buildQuery(AbstractAuditQuery.java:92)
at
org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:108)
at
org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:110)
(…)
當上面的代碼由視圖生成線程運行時,它工作正常.此外,DAO中的非envers代碼適用于每個線程.例如,下面的代碼段
@Override
public O load(Long id) {
final O find = em.find(getBaseClass(), id);
return find;
}
可以由RMI線程運行而不會出現問題.
為什么非視圖線程可以在沒有異常的情況下調用實體管理器上的方法,但是不能將Envers的AuditReaderFactory與該實體管理器一起使用?我認為可能在實體管理器上調用方法會創建一個臨時會話但是在使用Envers時不會發生,這是真的嗎?
解決該問題的最佳方法是什么(以便可以從每個線程使用AuditReaderFactory)?
總結
以上是生活随笔為你收集整理的java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 查询设置调优_MySQl 查
- 下一篇: gradle idea java ssm