RLK.JPA
EntityManager が終了時に閉じられていません
RLK (リソースリーク) 指摘は、割り当てられたリソースが使用後に適切に破棄されなかった場合に報告されます。リソースが適切に破棄されないと、次のような問題につながる可能性があります。
- 開いているファイルが多すぎます
- 必要なときにアプリケーションが一時ファイルにアクセスできない
警告 RLK.JPA は、JPA オブジェクトが終了時に閉じられていないことを示します。
脆弱性とリスク
entityManager などのリソースは、戻す前に明示的に閉じる必要があります。さもないと、同じレジストリに保持していない限り、そのリソースにもはや二度とアクセスできなくなります。
リソースを閉じないと、エンティティはその使用が完了した後も付属されたままになります。コンテキストは、EM にもうアクセスできなくなってもアライブ (有効) のままになります。
軽減と防止
重要でないと考えられるリソースであっても、メソッドを持つリソースはすべて明示的に閉じてください。こうすることで、将来的なコード変更時にもこのようなエラーから安全が保たれます。
脆弱コード例 1
コピー
public class ResourceLeakJpaEntityManager {
public void test() {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Books");
}
}
Klocwork は、4 行目で「'entityManagerFactory' オブジェクトが終了時に閉じられていません」という RLK.JPA 欠陥を報告します。
修正コード例 1
コピー
public class ResourceLeakJpaEntityManager {
public void test() {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Books");
entityManagerFactory.close();
}
}
この例では、5 行目でエンティティが閉じられているため、Klocwork はもはや欠陥を報告しなくなります。
脆弱コード例 2
コピー
public class ResourceLeakJpaEntityManager {
public void test() {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Books");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManagerFactory.close();
}
}
Klocwork は、5 行目で「'entityManager' オブジェクトが終了時に閉じられていません」という RLK.JPA 欠陥を報告します。
修正コード例 2
コピー
public class ResourceLeakJpaEntityManager {
public void test() {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Books");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.close();
entityManagerFactory.close();
}
}
この例ではエンティティが閉じられているため、Klocwork はもはや欠陥を報告しなくなります。