私は、これが私のアプリケーションで同じようにそれらをチュートリアルで使用している: http://www.benmccann.com/hibernate-with-jpa-annotations-and-guice/ジャージー、Guiceのと休止状態 - のEntityManagerスレッドセーフ
私のアプリは、多くの同時要求を受信し、データベースへの更新を行いますJAX-RS Webサービスです。
GenericDAOImpl.java実装:
public class GenericDAOImpl<T> implements GenericDAO<T> {
@Inject
protected EntityManager entityManager;
private Class<T> type;
public GenericDAOImpl(){}
public GenericDAOImpl(Class<T> type) {
this.type = type;
}
@Override
public void save(T entity) {
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.getTransaction().commit();
}
}
2つの同時実行スレッドは、エンティティを保存しようとすると、私はトランザクションをコメントする場合
java.lang.IllegalStateException: Transaction already active
の保存がうまく機能し得ます。
私は
@Inject
protected Provider<EntityManager> entityManagerProvider;
または
@Inject
protected EntityManagerFactory entityManagerProvider;
と要求ごとに使用しようとしました:
EntityManager entityManager = entityManagerProvider.get()
しかし、その後、私は得る:
org.hibernate.PersistentObjectException: detached entity passed to persist
Guice + Hibernate EntityManagerインジェクション/スレッドセーフ汎用DAOクラスを実装する正しい方法は何ですか? http://www.benmccann.com/hibernate-with-jpa-annotations-and-guice/
から
UPDATE
アンドリュー・レイナーのコメントは、「ロジックは本当に生産準備ができていない - Webアプリケーションで使用される少なくとも場合
休止状態の接続プールは非常に基本的なものです。生産準備ができていません - c3p0などのデータソースプールを使用することをお勧めします。
EntityManagerは再利用されません - トランザクション/リクエストごとに作成されることを意図しています。後続の要求を汚染する可能性があります。
何か問題が発生した場合でもトランザクションのロールバックはありません。
興味深いアプローチ - 。それはGuicesがEntityManangerインスタンスと取引のライフサイクルを管理するための拡張モジュールを永続自身の使用するWebアプリケーションのためのより安全だろう」
を助ける方法は公共のEntityManager provideEntityManagerを@Provides(のEntityManagerFactoryのEntityManagerFactory ) "スレッドごとに1つのエンティティマネージャを持つために、ここでThreadLocalストレージを使用します。"それはhttp://www.benmccann.com/hibernate-with-jpa-annotations-and-guice/に記載されています – Justas