5

休止状態を使用して多数のオブジェクトをデータベースに保存する必要があります。それらすべてを一度にコミットする代わりに、n (BATCH_SIZE) 個のオブジェクトがセッションに存在するとすぐにコミットしたいと考えています。

Session session = getSession();
session.setCacheMode(CacheMode.IGNORE);
for(int i=0;i<objects.length;i++){
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0){
        session.flush();
        session.clear();
    }
}

上記のようなことを試してみsession.flush()ましたが、データベースへの変更をコミットしていないことを読みました。これは、次のコードが正しい方法ですか?

Session session = getSession();
session.setFlushMode(FlushMode.COMMIT);
session.setCacheMode(CacheMode.IGNORE);
session.beginTransaction();
for(int i=0;i<objects.length;i++){
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0){
        session.getTransaction().commit();
        session.clear();
        //should I begin a new transaction for next batch of objects?
        session.beginTransaction();
    }
}
session.getTransaction().commit();
4

1 に答える 1

1

私が知る限り、あなたの解決策は正しいです。

問題が 1 つだけある可能性があります。SessionFactory からセッションを取得する方法によっては、コミットによってセッションが閉じられ、新しいセッションを開く必要がある場合があります。私の知る限り、これは getCurrentSession() とセッション コンテキスト「スレッド」を使用すると常に発生します。openSession() を使用している場合、セッションはコミットによって自動的に閉じられないようです。

これは、トランザクションのコミット後に isOpen() メソッドを使用して簡単に確認できます。セッションが閉じられた場合は、さらに save() を呼び出す前に、新しいセッションを開く必要があります。

于 2013-05-20T21:07:14.043 に答える