5

Hibernate docs에 따르면 JTA 환경에서 기본 연결 해제 모드는 after_statement입니다. 즉, 각 문이 끝나면 최대 절전 모드 논리적 연결이 해제됩니다.Bitronix Transcation Manager를 사용할 때 Hibernate after_transaction을 JTA 연결 해제 모드로 설정하는 것이 안전합니까?

논리 연결이 해제되면 Connection close() 메서드가 호출되고 현재 자원은 트랜잭션 관리자에서 제거됩니다. 레드햇 transaction developer guide 따르면

:

는 "delistResource 방법은 대상체의 트랜잭션 컨텍스트에서 지정된 자원을 해리하는데 사용되는 애플리케이션 서버는 두 개의 매개 변수를 사용하여 방법을 호출한다.

An XAResources object, which represents the resource. 
A flag to indicate whether the operation is due to the transaction being suspended (TMSUSPEND), a portion of the work has failed (TMFAIL), or a normal resource release by the application (TMSUCCESS)." 

Bitronix가 TMSUCCESS를 사용하기 때문에 :

currentTransaction.delistResource(xaResourceHolderState.getXAResource(), XAResource.TMSUCCESS); 

즉, 연결이 현재 연결에서 분리되었습니다. 트랜잭션 분기 및 가끔 enlisting 2 different connections for the same Resource Adapter 끝날 수 있습니다.

우리는 트랜잭션 당 하나 이상의 명령문을 실행하기 때문에 트랜잭션이 발생하는만큼 연결을 유지하는 것이 더 나은 선택이라고 생각합니다. 따라서 after_transaction 릴리스 모드가 더 매력적입니다.

after_transaction 릴리스 모드가 Bitronix에 더 적합합니까? 누구나 프로덕션 환경에서 경험 했습니까?

답변

6

적어도 BTM에서는 after_statement와 after_transaction간에 차이가 없어야합니다. 이론적으로, after_statement는 연결과 트랜잭션이 XA 컨텍스트에서 완전히 독립적이라고 가정하고 연결은 여러 트랜잭션을 한 번에 처리 할 수 ​​있어야하기 때문에 "정확합니다". 실제적으로 연결과 트랜잭션은 자원을 거의 지원하지 않기 때문에 거의 독립적이지 않습니다.

BTM 연결 풀은 상대적으로 복잡한 FSM을 구현하여 가능한 경우 연결을 재사용하면서 트랜잭션을 격리 된 상태로 유지할 수 있도록합니다.

단일 트랜잭션의 컨텍스트 내에서 반복적으로 풀에서 연결을 가져온 다음 닫는 것은 풀에서 하나의 연결 만 사용해야합니다. 항상 동일한 풀을 사용하여 다시 풀로 설정해야합니다. 내가 생각할 수있는 유일한 이유는 풀에서 두 개의 연결이 소모된다는 것입니다. 첫 번째 연결이 아직 닫혀 있지 않은 상태에서 다시 연결을 얻는 경우입니다. 다른 이유는 아마도 BTM의 연결 풀에서 버그로 간주 될 수 있습니다.

+1

답장을 보내 주셔서 감사합니다. Ludovic. 우리 시스템을 프로덕션으로 출시하려고하고 있으며 "after_transaction"플래그 세트로 테스트 할 시간이 없습니다. Spring TM, Hibernate Transaction Logic 래퍼 및 Bitronix 내부 동작의 복잡성으로 인해 범인을 찾아내는 것이 매우 어렵습니다. 필자는 2 개의 연결이 필요하다는 것을 알았지 만 2PC는 그것들을 단 2 개의 고립 된 XAResources로 취급 할 것이므로 TX의 원 자성이 보장됩니다. 생산 개시 이후 어쩌면 더 많은 시간을 들여야 할 것입니다. –

+0

이런 종류의 문제를 추적 할 때 BTM 디버그 로그는 매우 중요합니다. 맵핑을 활성화하고 매핑 된 진단 컨텍스트가 GTRID를 표시하도록 구성했는지 확인하십시오 (http://docs.codehaus.org/display/BTM/DebugLogging2x 참조). 이렇게하면 각 트랜잭션을 대신하여 수행 된 작업 (예 : 트랜잭션 당 로그를 간단한 grep으로 분리)을 쉽게 분리하고 연결 풀의 논리 흐름을 쉽게 따라갈 수 있습니다. –

+1

고마워, 나는 그것을 확실히 시도 할 것이다.단위 테스트 또는 통합 테스트에서 문제를 격리 할 수 ​​없다는 사실은 매우 실망 스럽습니다. 나는 실제 생산과 유사한 서버에 대해 실행되는 시스템 통합 테스트를 실시하고 있는데, 로그에서이 예외가보고되는 것을 볼 수 있습니다. 정보를 수집 할 때 일부 클래스 이름을 난독 화하여 BTM 문제 게시물에 게시하고 일부 흐름 이상을 발견 할 수 있습니다. –