Spring JPA 環境で永続化コンテキストを小さく保つにはどうすればよいですか?
理由: 永続化コンテキストを小さく保つことで、パフォーマンスが大幅に向上することはわかっています。
主な問題領域は次のとおりです。
@Transactional
void MethodA() {
WHILE retrieving next object of 51M (via a stateless session connection) DO
get some further (readonly) data
IF condition holds THEN
assessment = retrieve assession object (= record from database)
change assessment data
save the assessment to the database
}
この問題領域での実験により、250 回の反復ごとに永続化コンテキストを消去すると、パフォーマンスが大幅に向上することがわかっています。
これらの行をコードに追加すると、250 回の反復ごとに次のようになります。
@PersistenceContext
private EntityManager em;
WHILE ...
...
IF counter++ % 250 == 0 THEN
em.flush()
em.clear()
}
次に、「フラッシュ操作を確実に実行できません」などのエラーが発生します。
メインのトランザクションを読み取り専用にし、評価保存部分を「Transaction-requires-new」にしようとすると、「切り離されたエンティティで操作しています」などのエラーが発生します。私はオープンエンティティを再訪することは決してないので、非常に奇妙です。
では、永続化コンテキストを小さく保つにはどうすればよいでしょうか? 何十もの方法を試しました。助けていただければ幸いです。