주입되지 않았을 때 EnityManager를 닫는 방법은 무엇입니까?
문제
Oracle Occas 서버에서 서블릿이 실행됩니다. 현재 @Entity Annotaion을 사용하여 응용 프로그램의 엔티티 클래스에 데이터베이스의 일부 데이터를 매핑합니다. 그러나 EntityManager (@PersistEnceContext)를 주입하지 못하고, 그것이 별도의 엔티티 EJB가 아닌 내 서블릿 컨텍스트에서 실행되고 있기 때문에 내 이해에 대한 내 이해입니다. 그러나 EntityManagerFactory Works를 통해 관리자를 만들기 때문에 현재로서는 내가 사용하는 것입니다.
이제 응용 프로그램의 여러 재시작 후 Permgen 공간 오류가 발생합니다. 나는 이것이 어떻게 든 지속성과 관련이 있다고 생각한다. 내 최종 메소드에는 EntityManager.close ()에 대한 호출이 있지만 로그에는 결코 나타나지 않습니다.
이것이 나쁜 일을하는 나쁜 방법입니까? 별도의 엔티티 콩을 가지고 있어야합니까, 아니면 EntityManager를 어떻게 정리해야합니까?
해결책
비슷한 문제가 있었고 ThreadLocal 및 서블릿 필터를 사용하여 해결했습니다.
다음은 내 블로그의 게시물이 무엇을 해야하는지 자세히 설명합니다.; 기본적으로 서블릿 필터는 엔티티 관리자를 설정 한 다음 서블릿 호출이 완료된 후에 닫습니다. 엔티티 관리자가 스레드 로컬 변수 (Hibernate의 권장 사항에 따라)로 사용할 수 있습니다. 또한 필터에서 예외를 포착하고 롤백을해야합니다.
BTW, Finalize는 당신이 생각하는 방식으로 호출되지 않습니다. finalize
~해야 한다 JVM이 출구되기 전에 호출되지만 그 외에는 오래 걸릴 수 있습니다.