web-dev-qa-db-ja.com

Hibernateでのsession.clear()の仕組み

私は多くの記事を参照しましたが、それでも、_session.clear_がhibernateで実行することについてはまだ明確ではありません。

私がこれまでに遭遇したことによると、以下に示すようにバッチ保存/更新を使用すると:

_Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Employee employee = new Employee(.....);
    session.save(employee);
    if( i % 50 == 0 ) { // Same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();
_

sesion.flush();は、セッションをフラッシュする際に使用され、HibernateがSessionのメモリ内の状態をデータベースと同期させます。

質問

1。セッションをフラッシュした後、なぜsession.clear()を実行する必要があるのですか?本当に必要ですか?

2。session.clear()はコミットアクションを実行しますか?

session.clear()がすべてのロードされたオブジェクトを追い出す場合、コミットおよびロールバックアクションが実行されている間に内部で何が起こるか?

12
PRATHAP S

セッションは、現在のトランザクションを開始してから既にデータベースからロードした(または永続化した)エンティティのキ​​ャッシュと考えてください。

  1. _Session.clear_は必須ではありませんが、1つのトランザクション内で多くのエンティティのロード/保存を行う場合、メモリ不足エラーを回避するために役立ちます。この例では、50個のemployeeエンティティがセッションで複製されます。 flushおよびclearメソッドを50 save()ごとに呼び出すことなく、セッションで100.000のエンティティが複製されます(セッションにはエンティティへのリンクがあるため、ガベージコレクションはできません) )。

  2. _Session.clear_は、コミットもロールバックも実行しません。 flushでもない(したがって、_Session.clear_の前にフラッシュする必要があるので、hibernateは保留中のエンティティの更新に対してSQLクエリを生成します。

  3. ロールバックまたはコミットアクションはアプリケーション側では実行されませんが、データベースでは:hibernateはデータベースにコミットまたはロールバックを要求します(Hibernateはコミットアクションの前にフラッシュをトリガーする場合がありますが、フラッシュはコミットの一部ではありません)。コミットアクションはセッションにアクセスしません(できません)。これは、トランザクションの開始以降に実行されたすべてのSQLクエリのおかげで、実行されたデータ変更を永続化(または元に戻す)するデータベース内部メカニズムです。

まったく同じ方法で、hibernateでトランザクションを開くことは多くのことを実行しません。主に、プールからデータベース接続を取得し、データベースに[〜#〜] not [ 〜#〜]_auto_commit_ sqlクエリに続くが、コミットまたはロールバックコマンドを待つ。

18
Thierry