春+Hibernate+Envers+multithreading-セッションが閉じ
-
21-12-2019 - |
質問
を使用していまHibernate(JPA)、Hibernate Envers持続歴史をサポートします。ウェブアプリケーションを走る多くのスレッドしたRMIメソッドの呼び出しから他のアプリケーションの作成もしくは本アプリケーションの作成に取り扱http要求(これらを生成する必要があります。)
また、オープンセッション、ビューのパターンの管理はセッションでweb.xml ます。
<filter>
<filter-name>openEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
データベースを使用してアクセスDAOs、い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;
}
例外のスレッド"のスケジューラ"org.hibernate.SessionException:セッションが閉じら!時 org.hibernate.内.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129) 時 org.hibernate.内.SessionImpl.createQuery(SessionImpl.java:1776) 時 org.hibernate.envers.ツールです。を返します。QueryBuilder.toQuery(QueryBuilder.java:226) 時 org.hibernate.envers.を返します。impl.AbstractAuditQuery.buildQuery(AbstractAuditQuery.java:92) 時 org.hibernate.envers.を返します。impl.EntitiesAtRevisionQuery.リスト(EntitiesAtRevisionQuery.java:108) 時 org.hibernate.envers.を返します。impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:110) (...)
時に上記のコードはビューするスレッドで動作します。また、非enversコードDAO服の毎のスレです。例えば、以下のスニペット
@Override
public O load(Long id) {
final O find = em.find(getBaseClass(), id);
return find;
}
でRMIスレッド問題なく行えます。
できないのはなぜで非ビューのスレッド呼び方法の体長な例外が利用できないEnvers'AuditReaderFactoryる事業体か。と思ったものメソッドを呼び出の体長を一時セッションがなされるようにすることが使Envers、そうだったんですか?
何が最良の方法で固定する問題(そのAuditReaderFactory使用できるから毎のスレッド)?
解決
しなかったなどの理由で、大きな非uiのスレッドメソッドの呼び出しに EntityManagerFactory
たもののメソッドの呼び出しに AuditReaderFactory
なかった。とにかく、この方法で修理してください。
この溶液を注釈を付ける方法 @Transactional
.合方法、コールチェーンの前に呼び出しAuditReaderFactoryしたとして @Transactional
, たが、 SessionException
非uiです。
その作 loadByRevision
取引が十分でなかった。場合によって返されるオブジェクトの方法が含まれるものぐの駆け込み永続的なバッグ、アクセスして外部に loadByRevision
法範囲に LazyInitializationException
(あります。
最終的な解決したい場合は任意のスレッドのための負荷の一部のデータベースからデータの負荷としては、オブジェクトおよびアクセスすぐの駆け込み蔵)内方法のひとつに含 @Transactional
.