2012-01-03 3 views
0

사용자 정의 '연결'클래스로 JCA 어댑터를 빌드하고 있습니다. 지금까지 보았던 모든 예제에서 연결 클래스에 "void close()"를 넣어야합니다. 그런 다음 사용자 정의 연결 클래스를 사용하는 동안 finally 블록에 close()를 호출해야합니다.연결이 자동으로 닫히는 JCA 어댑터를 빌드 할 수 있습니까?

개발자들이 마침내 블록을 닫는 것을 기억하는 것을 정말로 신뢰하지 않습니다. 또한 EntityManager에서 "close()"를 호출 할 필요가 없습니다. 컨테이너는 EntityManager의 열기와 닫기를 자동으로 관리합니다.

JCA 어댑터에 대한 컨테이너 연결을 자동으로 닫을 수있는 방법이 있습니까? finalize()를 재정의하려고 시도했지만 JVM이 연결을 정리하기 전에 매우 오랜 시간이 걸릴 수 있습니다.

누군가가 findbugs에 대한 플러그인 작성 방법을 알고 있으면 어디서나 사용자 정의 연결 클래스가 finally 블록에서 close()없이 사용되었습니다 ... 아마도 그 점은 좋을 것입니다.

답변

1

워크 플로우를 알고 있다면 연결에 대한 활동을보고있는 배경 스레드를 가질 수 있으며 일정 시간 (10 초, 30 초, 2 시간 등)이 지나면 아무 것도 닫을 수 있습니다.

언급 한 것처럼 finalize 메서드를 재정의 할 수도 있습니다. 사용이 가능하고 보장되지 않습니다. 그러나 합리적으로 사용량이 많은 서버의 경우 대부분의 연결을 제 시간에 닫을 수있는 충분한 GC 활동을 얻게됩니다. 마무리가 보장되지 않는다는 경고는 단순히 누군가가 프로세스를 죽이면 (또는 잘못되거나 무엇이든) 최종 결정이 호출되지 않는다는 것을 받아들입니다.

마지막으로 새로운 예외를 만들고 스택 추적을 채우는 것만으로 간단하게 연결을 캡처 할 수 있습니다. 닫힌 연결을 사용하여 예외를 지키십시오. 그리고 시간이 흐르거나 종료 될 때 등 "강제로"닫히는 것을 감지하면 로그에 예외를 덤프하여 잘못된 "열린"줄을 찾을 수 있습니다. 연결.

커넥터가 삭제되거나 배포 취소 된 경우 (즉, 모듈이 서버에서 제거되거나 서버가 종료 된 경우) JCA 수명주기를 연결해야합니다. 이렇게하면 모듈이 제거 된 상태로 열린 연결이 무엇인지 알 수 있습니다.

+0

그래서 짧은 대답은 "정말로"아닙니다 :) –