<Error> <Kernel> <BEA-000802> <ExecuteRequest failed
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Unexpected exception while enlisting XAConnection java.sql.SQLException: XA error: XAResource.XAER_RMFA
IL start() failed on resource 'XXXDomain': XAER_RMFAIL : Resource manager is unavailable
XA 구조에서 WebLogic과 DB가 해당 Error로 연동이 안되는 문제가 발생했다.
해당 문제는 WebLogic JTA timeout 값을 설정해야 한다. (JTA timeout exception)
========================================
# JTA timeout이란?
활성 트랜잭션이 2단계 커밋 트랜잭션 중 첫번째 단계에서 허용하는 최대 시간(초) 지정된 시간이 만료되면 트랜잭션이 자동으로 롤백됨 |
========================================
WebLogic JTA timeout은 default가 30이며, 추가적으로 값을 설정할 시 Oracle에서는 다음과 같이 안내하고 있다.
JTA timeout 값이 부족하면 병목현상이 일어난다. => JTA timeout은 30 ~ 3600 까지 설정이 가능하고, Oracle은 임의의 값이긴 하지만, 만약 병목현상이 일어나서 timeout 값을 증가시켜야 할 경우 300을 우선적인 권장값으로 두고 있다. => 다만 초기 설정값에서 점점 값을 낮춰가면서 위의 해당 문구가 많이 나타나지 않는 지점까지 지속적으로 적정값을 찾아야 한다. => JTA timeout 값이 너무 클 경우, 걸려 있는 thread 숫자가 많을 때 시스템이 때때로 중단될 수 있다는 점을 유의해야 한다. => 최종 목표는 JTA timeout 값을 조정하여 JTA timeout exception을 하루 기준, 아예 없거나 아주 적게 확인되는 수치로 조정하는 것이다. |
다만 JTA timeout을 설정할 때 DISTRIBUTED_LOCK_TIMEOUT, XA Transaction Timeout의 설정값을 고려해야 한다.
일반적인 규칙은 WebLogic Server JTA timeout이 참여하는 XA Resource에 대해 구성/설정된 최단 시간 초과 값보다 낮은 값으로 설정되었는지 확인하는 것이다. 그렇게 하지 않으면 예기치 않은/일관성 없는 분산 트랜잭션 결과가 발생할 수 있다. 시간 초과된 XA Resource는 WebLogic Server가 조치를 취하기 전에 분산 트랜잭션의 자체 부분을 해결하기 위해 조치를 취할 수 있다. 이것은 WebLogic 트랜잭션 관리자가 분산 트랜잭션을 준비/커밋하려고 할 때 경험적 오류 메시지로 이어진다. 또한 Oracle DB의 경우 Oracle DB 초기화 파일의 DISTRIBUTED_LOCK_TIMEOUT 매개변수를 XA Transaction Timeout보다 높게 설정하는 것이 좋다(default 60). 그렇게 하지 않으면 WebLogic Server JTA 또는 JDBC XA Transaction Timeout이 해당 분산 트랜잭션 시간 초과 상황을 처리하기 위한 조치를 취하기 전에, DB 측에서 in-doubt table locks가 발생할 수 있다. |
만약 JTA timeout을 늘리고 싶다면 DB의 DISTRIBUTED_LOCK_TIMEOUT 파라미터 설정값 변경 여부를 우선적으로 고려해야 한다.
========================================
# XA Transaction Timeout 이란?
트랜잭션 분기 timeout으로 설정할 시간(초). 설정된 경우 이 값은 XA 자원 관리자(일반적으로 JDBC 드라이버)에 대한 XAResource.setTransactionTimeout() 호출에서 트랜잭션 시간 초과 값으로 전달됨 이 값이 0으로 설정되면 WebLogic Server 트랜잭션 관리자는 메서드에서 전역 WebLogic Server 트랜잭션 시간 초과(초)를 전달합니다. 설정된 경우 이 값은 전역 WebLogic Server transaction timeout보다 크거나 같아야 합니다. # 참고: 트랜잭션 분기 시간 초과 설정을 활성화하려면 XaSetTransactionTimeout을 활성화해야 합니다. |
========================================
'Oracle > TroubleShooting' 카테고리의 다른 글
Waiting on Condition (0) | 2022.11.21 |
---|---|
WebLogic console 404 error (0) | 2022.11.14 |
Missing SerializedSystemIni.dat (0) | 2022.10.24 |
weblogic.management.DeploymentException: Application xxxx does not have any Components in it (0) | 2022.09.07 |
WebLogic 윈도우 서비스 등록 시 JVM 생성 못하는 issue (0) | 2022.08.29 |