javascript
java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...
我們使用Hibernate(使用JPA)和Hibernate Envers來持久化對(duì)象的歷史. Web應(yīng)用程序運(yùn)行許多線程,其中一些是通過其他應(yīng)用程序的RMI方法調(diào)用創(chuàng)建的,其中一些是由應(yīng)用程序本身創(chuàng)建的,其中一些是為處理http請(qǐng)求而創(chuàng)建的(它們生成視圖).
我們還使用Open Session In View模式來管理會(huì)話,因此我們的web.xml包含:
openEntityManagerInViewFilter
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
openEntityManagerInViewFilter
/*
使用DAO訪問數(shù)據(jù)庫,所有這些都有Spring注入的EntityManagers.
@PersistenceContext
protected EntityManager em;
@PersistenceUnit
protected EntityManagerFactory emf;
在我們決定使用Hibernate Envers之前,一切都運(yùn)行良好.當(dāng)任何不是視圖生成線程的線程運(yùn)行代碼以獲取舊版本的對(duì)象時(shí),拋出異常.
@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)
(…)
當(dāng)上面的代碼由視圖生成線程運(yùn)行時(shí),它工作正常.此外,DAO中的非envers代碼適用于每個(gè)線程.例如,下面的代碼段
@Override
public O load(Long id) {
final O find = em.find(getBaseClass(), id);
return find;
}
可以由RMI線程運(yùn)行而不會(huì)出現(xiàn)問題.
為什么非視圖線程可以在沒有異常的情況下調(diào)用實(shí)體管理器上的方法,但是不能將Envers的AuditReaderFactory與該實(shí)體管理器一起使用?我認(rèn)為可能在實(shí)體管理器上調(diào)用方法會(huì)創(chuàng)建一個(gè)臨時(shí)會(huì)話但是在使用Envers時(shí)不會(huì)發(fā)生,這是真的嗎?
解決該問題的最佳方法是什么(以便可以從每個(gè)線程使用AuditReaderFactory)?
總結(jié)
以上是生活随笔為你收集整理的java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 查询设置调优_MySQl 查
- 下一篇: java的自动装配是什么意思_java