2016-09-04 4 views
2

最近、私はhibernate 3.xを使い始めました。文「をフラッシュすると、Hibernateはセッションのメモリ内の状態をデータベースと同期させます」と混乱します。なぜ私たちは休止状態でフラ​​ッシュする必要がありますか?

私は以下の点を理解する助けてください -

  1. フラッシュは、それは例えば、そのクエリ文を挿入して何それはどういう意味を意味しているデータベースとのセッションのメモリ内の状態を同期が実行され、データはテーブルに保存されますが、他のセッションではデータが表示されませんでした。

  2. このデータは、セッションオブジェクトまたはデータベーステーブル自体に存在します。

  3. 例外が発生した場合、例外シナリオはどのように発生しますか?

例を参照してください。

答えて

2

セッションを強制的にフラッシュします。これは、セッションデータをデータベースと同期するために使用されます。 session.flush()を呼び出すと、ステートメントはデータベース内で実行されますが、コミットされません。

session.flush()を呼び出さずに、session.commit()を呼び出すと、内部的にcommit()メソッドが文を実行し、コミットします。

so commit()= flush + commit

したがって、seesion.flush()はデータベース内の文を実行するだけですが(コミットではありません)、ステートメントはもはやメモリにありません。セッションを強制的にフラッシュするだけです。

フラッシュは、主に数千から数百万のレコードを扱うときに使用されます。 このような数のレコードを扱う際には、バッチ更新とフラッシュを使用します。上記の例では

Session session = SessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) { 
    Employee emp = new Employee(.....); 
    session.save(emp); 
} 
tx.commit(); 
session.close(); 

あなたはそれがOutOfMemoryErrorが発生をスローすることがフラッシュ呼び出していない場合。

あなたはなぜ、私たちが直接フラッシュ+は、いくつかの時間のためにコミット=文のコミットを忘れてコミットすることはできませんflushing

+0

については、この記事をチェックアウトすることができます。私が直接コミットするならば、何が欠点になるか想像してください。 – CoreThought

+0

セッション中に10k insert文があり、メモリサイズが非常に小さい場合を考えてみましょう。この場合、レコードをフラッシュすると、insert文がデータベース上で実行されますが、操作をコミットしない限り、データはデータベースに反映されません。これらの挿入文をロールバックするには、操作をコミットしなかったためにロールバックできます.10kレコードを1kレコードの10グループに変換します。これらのレコードをセッションに格納するメモリがないため、 – Abhijeet

+0

私たちはそれをロールバックすることはできません。 – Abhijeet