私は、メモリリークを回避するために、多くの場合、EntityManager.clear()を呼び出すことになっているだろうか?
-
19-09-2019 - |
質問
私はJPA / OpenJPAのに新たなんだと私はエンティティを永続化した後、私はEntityManager.clear()
を呼び出さない場合、私はOutOfMemoryError
(私はループ内で新しいエンティティを追加し続ける)を得ることに気づきました。これは正常な動作であるか、それだけだとOpenJPAの1.2.1グリッチどうかはわかりません。
だから、私は明示的に実体を自分自身を切り離すために必要なのですか? 私はありません場合は、それがとにかく良い練習ですか?
解決
私はJPAで多くの経験を持っていません。しかし、これは便利だろう -
:JPAでは、どちらかでなければなりません
- 各トランザクションのための新しいEntityManagerを作成します
。
- 永続コンテキストをクリアするために、各トランザクションの後)(クリアコール
他のヒント
は、あなたが永続化プロセス(読み)に持ち込むどのように多くのオブジェクトによって異なります。あなたが多数(またはオブジェクトのいくつかが大きい)を扱う場合は、(クリアの使用)の意味を作ることができます。オブジェクトが読まれるたびに、それはJPAのIMPLによってL1キャッシュに配置する必要があります。
あなたのデザインのどこかで間違って何かがあるようですね。それはエンティティマネージャの範囲外になると通常、エンティティがデタッチされます。そして、範囲外、あなたは怠惰なロード関係することはできません理由の一つのthatsます。
限り私の経験に関しては、私はめったに使われないem.clear()、もし今までに。私は、Hibernateの実装、およびTopLink Essentialsの使用しました。 OpenJPAのではありません経験、まだます。