88

org.hibernate.Session.flush()個別に呼び出すことをお勧めしますか?

org.hibernate.Sessionドキュメントで述べたように、

トランザクションをコミットしてセッションを閉じる前に、作業単位の最後に呼び出す必要があります (フラッシュモードに応じて、Transaction.commit() がこのメソッドを呼び出します)。

flush()明示的に呼び出す目的を説明していただけますorg.hibernate.Transaction.commit()か?

4

7 に答える 7

104

Hibernate Manual では、この例を見ることができます

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for (int i = 0; i < 100000; i++) {
    Customer customer = new Customer(...);
    session.save(customer);
    if (i % 20 == 0) { // 20, same as the JDBC batch size
        // flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

フラッシュ メソッドを呼び出さないと、第 1 レベルのキャッシュが OutOfMemoryException をスローします。

また、フラッシングに関するこの投稿を見ることができます

于 2013-01-29T11:38:53.450 に答える
92

flush()データベースをメモリに保持されているオブジェクトの現在の状態と同期しますが、トランザクションはコミットしません。したがって、flush()が呼び出された後に例外が発生すると、トランザクションはロールバックされます。. _ flush()_ commit()_OutOfMemoryException

commit()データベースに保存されたデータを永続的にします。commit()が成功すると、トランザクションをロールバックする方法はありません。

于 2014-11-17T15:30:07.083 に答える
57

明示的にフラッシュする一般的なケースの 1 つは、新しい永続エンティティを作成し、後で同じトランザクションで使用できるように人工的な主キーを生成して割り当てたい場合です。その場合、フラッシュを呼び出すと、エンティティに ID が与えられます。

もう 1 つのケースは、第 1 レベルのキャッシュに多くのものがあり、(キャッシュによって使用されるメモリの量を減らすために) 定期的にクリアしたいが、それでも全体をまとめてコミットしたい場合です。 . これは、アレクセイの答えがカバーするケースです。

于 2013-01-29T14:37:50.253 に答える
14

flush();フラッシュは、基になる永続ストアを、メモリに保持されている永続状態と同期するプロセスです。実行中のトランザクションでテーブルを更新または挿入しますが、それらの変更をコミットしない場合があります。

バッチ処理でフラッシュする必要があります。そうしないと、 OutOfMemoryException が発生する可能性があります。

Commit();Commit はデータベースをコミットします。永続化されたオブジェクトがあり、その値を変更すると、それはダーティになり、休止状態はこれらの変更を永続化レイヤーにフラッシュする必要があります。したがって、コミットする必要がありますが、作業単位も終了します ( transaction.commit())。

于 2014-11-07T09:49:44.947 に答える
5

デフォルトのフラッシュ モードは AUTO です。これは、「クエリが古い状態を返さないようにするために、クエリの実行前にセッションがフラッシュされる場合がある」ことを意味しますが、ほとんどの場合、変更をコミットするとセッションがフラッシュされます。FlushMode=MANUAL を使用する場合、または何らかの最適化を行いたい場合は、flush メソッドを手動で呼び出すと便利です。しかし、私はこれをやったことがないので、実際的なアドバイスはできません。

于 2013-01-29T11:39:40.300 に答える