私は多くの記事を参照しましたが、それでも、_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()
がすべてのロードされたオブジェクトを追い出す場合、コミットおよびロールバックアクションが実行されている間に内部で何が起こるか?
セッションは、現在のトランザクションを開始してから既にデータベースからロードした(または永続化した)エンティティのキャッシュと考えてください。
_Session.clear
_は必須ではありませんが、1つのトランザクション内で多くのエンティティのロード/保存を行う場合、メモリ不足エラーを回避するために役立ちます。この例では、50個のemployee
エンティティがセッションで複製されます。 flush
およびclear
メソッドを50 save()
ごとに呼び出すことなく、セッションで100.000のエンティティが複製されます(セッションにはエンティティへのリンクがあるため、ガベージコレクションはできません) )。
_Session.clear
_は、コミットもロールバックも実行しません。 flush
でもない(したがって、_Session.clear
_の前にフラッシュする必要があるので、hibernateは保留中のエンティティの更新に対してSQLクエリを生成します。
ロールバックまたはコミットアクションはアプリケーション側では実行されませんが、データベースでは:hibernateはデータベースにコミットまたはロールバックを要求します(Hibernateはコミットアクションの前にフラッシュをトリガーする場合がありますが、フラッシュはコミットの一部ではありません)。コミットアクションはセッションにアクセスしません(できません)。これは、トランザクションの開始以降に実行されたすべてのSQLクエリのおかげで、実行されたデータ変更を永続化(または元に戻す)するデータベース内部メカニズムです。
まったく同じ方法で、hibernateでトランザクションを開くことは多くのことを実行しません。主に、プールからデータベース接続を取得し、データベースに[〜#〜] not [ 〜#〜]_auto_commit
_ sqlクエリに続くが、コミットまたはロールバックコマンドを待つ。