JDBC 연결이 JTA 지원 DataSource 또는 직접 JDBC에서 검색되었는지 어떻게 확인합니까?

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

문제

저는 애플리케이션 데이터베이스에 대한 JDBC 연결을 얻기 위해 공급업체 API를 사용하고 있습니다.API는 애플리케이션 서버에서 실행되거나 독립형 모드에서 실행될 때 작동합니다.단일 트랜잭션에서 일련의 SQL 문을 실행하고 싶습니다.JTA 트랜잭션이 존재한다면 그 컨텍스트에서 발생하는 문제는 괜찮습니다.그러나 그렇지 않은 경우에는 JDBC 트랜잭션 경계 지정 방법을 사용해야 합니다.(JTA 트랜잭션에 참여하는 JDBC 연결에서 이러한 메소드를 호출하면 SQLException이 발생합니다.)

따라서 연결이 JTA 지원 DataSource에서 왔는지 아니면 단순한 JDBC 연결인지 확인할 수 있어야 합니다.

이 결정을 내리는 직접적인 방법이 있습니까?

감사해요!

도움이 되었습니까?

해결책

똑바로 JDBC이더라도 JTA 트랜잭션을 활성화 할 수 있습니다. 자동 커밋 플래그를 확인하는 것은 이와 관련하여 도움이되지 않습니다. AutoCommit이 False로 설정하여 배포되거나 다른 방법으로 거래 할 수 있습니다. Autocommit 설정은 True로 설정되면 분산 거래가 아니지만 False의 가치는 단지 귀하가 자동 커미트를 제공하지 않는다는 것을 의미합니다. 모든 종류의 거래에있을 수 있습니다.

userTransaction.getStatus ()를 호출하고 상태와 같지 않은지 확인해야한다고 생각합니다. 이것은 당신이 JTA 거래에 있는지 알려줄 것입니다.

다른 팁

Thilo가 말하는 것은 의미가 있습니다.

그렇지 않으면 똑바로 잘 모르겠지만 "해킹"방법을 줄 것입니다.

당신이 알고있는 나쁜 SQL을 작성하면 DB 예외가 제공됩니다. 이로 인해 스택 추적이 발생합니다. 스택 추적에서 JTA 파생 연결인지 아닌지 확인할 수 있습니까?

Connection의 autoCommit 플래그를 확인하여 그것이 트랜잭션에 있는지 확인할 수 있습니다(어디에서 왔는지에 관계없이).(분명히 허용되는 답변을 참조하십시오. 이것은 잘 작동하지 않습니다.다음 사항이 여전히 유효하기 때문에 이 답변을 삭제하지 않습니다.)

하지만 외부 트랜잭션에만 의존하도록 API를 수정해야 한다고 생각합니다.여전히 일반 JDBC를 지원하려면 트랜잭션을 시작하는 별도의 API로 래핑하세요.

업데이트:질문을 다시 읽고 API를 제공하지 않고 컨테이너 관리 연결을 사용하고 싶다는 것을 확인했습니다.하지만 그럼에도 불구하고 (응용 프로그램 요구 사항의 일부로) JTA가 적용되도록 강제할 수 있습니까?그렇지 않은 경우 수동으로 관리되는 트랜잭션으로 대체하는 구성 옵션을 제공할 수 있습니다.그러한 중요한 기능의 경우 적절한 구성을 요구하는 것이 합리적으로 보입니다(무엇이 적절할지 추측하려고 시도하는 것과는 반대로).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top