2008-10-07 3 views
4

저는 공급 업체 API를 사용하여 응용 프로그램의 데이터베이스에 대한 JDBC 연결을 확보하고 있습니다. API는 응용 프로그램 서 v에서 실행 중이거나 독립형 모드에서 실행 중일 때 작동합니다. 단일 트랜잭션에서 일련의 SQL 문을 실행하려고합니다. JTA 트랜잭션의 컨텍스트에서 발생하는 문제는 존재합니다. 그러나 그렇지 않다면 JDBC 트랜잭션 구분 방법을 사용해야합니다. (JTA 트랜잭션에 참여하는 JDBC 연결에서이 메서드를 호출하면 SQLException이 발생합니다.)JDBC 연결이 JTA 사용 데이터 소스 또는 JDBC에서 검색되었는지 어떻게 결정합니까?

그래서 Connection이 JTA 사용 데이터 소스에서 왔는지 또는 JDBC 연결이 단순한 것인지를 결정할 수 있어야합니다.

이 결정을 내릴 수있는 간단한 방법이 있습니까?

감사합니다.

답변

4

JDBC의 경우에도 JTA 트랜잭션을 활성화 할 수 있습니다. autoCommit 플래그를 확인하는 것은 이와 관련하여 도움이되지 않습니다. autoCommit을 false로 설정하여 트랜잭션, 분산 또는 다른 방법으로 사용할 수 있습니다. autoCommit을 true로 설정하면 분산 트랜잭션에 있지 않다는 것을 알 수 있지만 false 값은 자동 커밋을하지 않는다는 것을 의미합니다. 이는 모든 트랜잭션에서 발생할 수 있습니다.

UserTransaction.getStatus()를 호출하고 Status.NoTransaction()과 같지 않은지 확인해야한다고 생각합니다. 이것은 JTA 트랜잭션에 있는지 알려줄 것입니다.

-1

연결의 autoCommit 플래그를 확인하여 해당 트랜잭션의 출처와 관계없이 트랜잭션에 있는지 확인할 수 있습니다.

하지만 난 당신이 정말 독점적으로 외부 거래에 의존하여 API를 수정해야한다고 생각 : (. 분명히, 허용 대답을 참조하십시오이 너무 잘 작동하지 않습니다 나는이 대답을 삭제하지 않는 경우 다음은 여전히 ​​유효하기 때문에) . 여전히 일반 JDBC를 지원하려면 트랜잭션을 시작하는 별도의 API로 래핑하십시오.

업데이트 : 질문을 다시 읽고 API를 제공하지 않지만 컨테이너 관리 연결을 사용하려는 것으로 나타났습니다. 하지만 여전히, JTA가 효과가 있다는 것을 (어플리케이션의 요구 사항의 일부로) 위임 할 수 있습니까? 그렇지 않은 경우 수동으로 관리되는 트랜잭션으로 폴백하는 구성 옵션을 제공 할 수 있습니다. 이러한 중요한 기능을 위해서는 적합한 구성을 요구하는 것이 합리적입니다 (적절한 것이 무엇인지 추측하는 것과는 대조적 임).

+0

자동 커밋은 어쨌든 커밋을 나타내는 동작으로, 실제로 XA가 처리되거나 트랜잭션이 처리되지 않습니다. –

0

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

그렇지 않으면, 직선 방법을 잘하지만 내가 당신에게 "해킹"방법

를 제공하지 않습니다 당신은 DB 예외를 줄 것이다 알고있는 BAD SQL 물품. 그러면 스택 추적이 발생합니다. 스택 추적에서 JTA 파생 연결인지 여부를 확인할 수 있습니까?

관련 문제