, 그것은 Hibernate에 의해 던져Hibernate 세션을 깨는 방법? Hibernate 참조에서
모든 예외가 치명적인 것을 여러 번 언급된다. 즉, 데이터베이스 트랜잭션을 롤백하고 현재
Session
을 닫아야 함을 의미합니다. 예외를 던진Session
으로 작업하는 을 계속할 수 없습니다.
기존 응용 프로그램 중 하나는 단일 세션을 사용하여 파일의 많은 레코드를 DB 테이블로 업데이트/삽입합니다. 각 레코드 갱신/삽입은 별도의 트랜잭션에서 수행되며 커밋되거나 오류가 발생하면 롤백됩니다. 그런 다음 다음 레코드에 대해 새 트랜잭션이 열리는 등의 작업이 수행됩니다. 그러나 처리의 중간에 HibernateException
이 잡힌 경우에도 동일한 세션이 전체 프로세스에서 사용됩니다. 우리는 JBoss 4.2에서 Hibernate 3.24.sp1과 함께 Oracle 9i btw를 사용하고 있습니다.
위의 책을 읽으면이 디자인이 실패 할 수 있음을 알았습니다. 그래서 각 레코드 업데이트마다 별도의 세션을 사용하도록 앱을 리팩토링했습니다. 모의 세션 팩토리가있는 단위 테스트에서 각 레코드 업데이트에 대해 새로운 세션을 요청하고 있음을 확인할 수 있습니다. 여태까지는 그런대로 잘됐다.
그러나 전체 응용 프로그램을 테스트하는 동안 세션 실패를 재현 할 수있는 방법이 없습니다 (스트레스 테스트 btw입니까, 아니면 ...?). 우리는 DB의 청취자를 닫는 것을 생각했지만 응용 프로그램이 DB에 대한 연결을 열어 놓고 있다는 것을 깨달았습니다. 청취자는 이러한 연결에 영향을 미치지 않습니다. (이 앱은 매일 밤 스케줄러에 의해 활성화되는 웹 앱이지만 브라우저를 통해 활성화 될 수도 있습니다.) 그런 다음 앱에서 업데이트를 처리하는 동안 DB에서 이러한 연결 중 일부를 죽이려고했습니다. 이로 인해 일부 오류가 발생했습니다 업데이트하지만, 앱은 행복하게 나머지 레코드를 계속 업데이트합니다. 분명히 Hibernate는 전체 세션을 깨지 않고 두절 된 연결을 다시 열 수있을 정도로 영리하다.
Google의 앱이 원래 형태로도 충분히 견고하기 때문에 중요한 문제는 아닙니다. 그러나 문제는 나를 계속 괴롭 히고 있습니다. 어떤 상황에서
- 가 최대 절전 모드 세션이 실제로 사용할 수 없게 될 않는
HibernateException
가 발생 후 : 내가 알고 싶습니다 (:과 증상은 무엇인가 업데이트)? - 테스트에서이를 재현하는 방법 (업데이트 :, 단위 테스트가 아닌 통합이 바람직 함)?
- (예 : 시험에 대한 적절한 용어는 무엇입니까?) HibernateException이가 던진 후 어떤 상황에서
1)에 대해서는이 점도 제 이해입니다. 그래서 우리 앱을 더욱 강력하게 만들었습니다. 직접적인 문제는 독립적 인 테스트에서이를 확인하는 방법입니다. 2) 재미있는 소리입니다. 앱 자체를 수정하지 않고도 가능합니다. –