私は、各スレッドがオブジェクトを取得し、それをテーブルに挿入しようとするマルチスレッドアプリケーションにHibernateを使用しようとしています。私のコードは以下のようになります。 スレッドごとにローカルなハイバネートセッションオブジェクトを持ち、各InsertDataにbeginTransactionとcommitを行います。マルチスレッドアプリケーションでHibernateを使用するには?
私が直面しています問題は何度も私が得ることである「org.hibernate.TransactionException:ネストされたトランザクションがサポートされていない」
私は私がやっていることは正しいかどうかはわからない休止状態に新しいですので、またはない?私はマルチスレッドアプリケーションでhibernateを使用する正しい方法と上記の例外を回避する方法を教えてください。
おかげ
public class Worker extends Thread {
private Session session = null;
Worker() {
SessionFactory sf = HibernateUtil.getSessionFactory(); // Singleton
session = sf.openSession();
session.setFlushMode(FlushMode.ALWAYS);
}
public void run() {
// Some loop which will run thousand of times
for (....)
{
InsertData(b);
}
session.close();
}
// BlogPost Table has (pk = id AutoGenerated), dateTime, blogdescription etc.
private void InsertData(BlogPost b) {
session.beginTransaction();
Long id = (Long) session.save(b);
b.setId(id);
session.getTransaction().commit();
}
}
私の休止状態の設定ファイルがc3p0.min_size=10
とc3p0.max_size=20
限り、あなたが複数のスレッド間でセッションオブジェクトを共有していないように、セッション・オブジェクト・スレッド単位で
これは 'b.setId()'であるはずですか? –
うん、ちょうどそれを修正しました。 Typoは私の実際のコードの最小限の例を作成しようとしている間に起こった。 – Rahul