2012-12-14 26 views
20

カスタムJPAマッパークラスのメソッドがあります:私は(明確な理解していればEntityManager.clear()をいつ使用しますか?

removeUser() 

1. execute 'DELETE' HQL query to remove user 
2. call getEntityManager().flush(); 
3. call getEntityManager().clear(); 

)を正しく、それは文脈からすべての永続エンティティを削除します。 -source

はしかし、私はまたhere

you should define clear architecture- and design guidelines about where a 
clear() can be called. 

を読んで()をクリア呼び出す際の明確なガイドラインは何ですか?

答えて

22

記事で説明しています。エンティティマネージャをクリアすると、関連付けられたキャッシュが空になり、新しいデータベースクエリがトランザクションの後半で強制的に実行されます。トランザクションにバインドされたエンティティマネージャを使用する場合、エンティティマネージャをクリアする必要はほとんどありません。バッチ処理を行う場合、メモリを食べて巨大なキャッシュを持って、あなたがDMLまたはSQLをやっているとき

  • が長いため、汚れチェックのフラッシュする時間を増やすことを避けるために、

    • :私はクリアするには、2つの理由を参照してくださいクエリはエンティティマネージャのキャッシュを完全にバイパスします(例のように)。この場合、キャッシュによって保持されている状態はクエリのためにデータベースにあるものを反映しないため、この矛盾を避けるためにキャッシュをクリアする必要があります。
  • +0

    トランザクションにバインドされたエンティティマネージャでない場合は、ガベージコレクションのように時折EM自体がクリアされますか? –

    +0

    EMは、キャッシュされていないキャッシュをクリアしてクリアすることをお勧めします。 –

    +0

    私が間違っていれば私を訂正しますが、私は「クリア」を使用する3番目の理由は何でしょうか? Test-Casesの 'tearDown'関数であるようにEntityManagerは常にクリーンな状態を持ち、例えば、 dbal接続 – Nickolaus

    5

    はい、正確にはドキュメントのポイントとしてプラットフォームのアーキテクチャスタイルに依存します。例えば

    • アプリケーションEMにスレッドの関連付けられている場合は、トランザクション管理のための1 のソリューションは、ユーザの要求の各起動時にトランザクションを開始し、&明確なコミットセッションごとの要求パターンを実装することですダーティリードを防止するために、要求の各端にキャッシュを配置します。これはほんの単なる例です。
    • その他の例はSOAプラットフォームです。各サービスについて、最初にトランザクションをオープンし、最後にコミットすることもできます(同じEMを他のサービスで使用し、読み込みを避ける必要がある場合)
    • 前の2つの一般的なケースを再生します - 可能なすべてのケースでバイパス処理を行い、EMをバイパスします。したがって、この場合、クエリはキャッシュからではなく、DBからのクエリを強制されます。
    • L1キャッシュとL2キャッシュを使用し、L1はEMによってキャッシュをクリアすることを理解する必要があります。

    使用しているプラ​​ットフォームのケース、アーキテクチャ、スタイルによって決まります。あなたの方法に直接 -

    関連する問題