5.4. XA 등록 문제 해결
XA 리소스를 등록하기 위한 표준 JTA 접근 방식은 현재 트랜잭션을 나타내는 현재 javax. Cryostat.Transaction
오브젝트에 XA 리소스를 명시적으로 추가하는 것입니다. 즉, 새 트랜잭션이 시작될 때마다 XA 리소스를 명시적으로 추가해야 합니다.
5.4.1. XA 리소스에 가입하는 방법
트랜잭션을 사용하여 XA 리소스를 등록하려면 트랜잭션 인터페이스에서
합니다. 예를 들어 enlistResource()
메서드를 호출해야TransactionManager
개체와 XAResource 개체가 지정되면 다음과 같이 XAResource
개체를 등록할 수 있습니다.For example, given a TransactionManager object and an XAResource
object, you could enlist the XAResource object as follows:
// Java import javax.transaction.Transaction; import javax.transaction.TransactionManager; import javax.transaction.xa.XAResource; ... // Given: // 'tm' of type TransactionManager // 'xaResource' of type XAResource // Start the transaction tm.begin(); Transaction transaction = tm.getTransaction(); transaction.enlistResource(xaResource); // Do some work... ... // End the transaction tm.commit();
리소스 등록의 까다로운 측면은 각 새 트랜잭션에 리소스를 등록해야 하며 리소스를 사용하기 전에 리소스를 등록해야 한다는 것입니다. 리소스를 명시적으로 추가하는 경우 enlistResource()
호출을 사용하여 리터링된 오류-prone 코드로 끝날 수 있습니다. 또한 적절한 위치에서 enlistResource()
를 호출하기 어려울 수 있습니다. 예를 들어 일부 트랜잭션 세부 정보를 숨기는 프레임워크를 사용하는 경우입니다.
5.4.2. 자동 목록 정보
XA 리소스를 명시적으로 등록하지 않고 XA 리소스의 자동 목록을 지원하는 기능을 사용하는 것이 더 쉽고 안전합니다. 예를 들어 JMS 및 JDBC 리소스 사용 컨텍스트에서 표준 기술은 자동 목록을 지원하는 래퍼 클래스를 사용하는 것입니다.
JDBC 및 JMS 액세스 모두에 대한 일반적인 패턴은 다음과 같습니다.
-
애플리케이션 코드는 JDBC 액세스에는
javax.sql.DataSource
와 JMS의 경우javax.jms.ConnectionFactory
가 JDBC 또는 JMS 연결을 가져와야 합니다. - 애플리케이션/OSGi 서버 내에서 이러한 인터페이스의 데이터베이스 또는 브로커 특정 구현이 등록됩니다.
- 애플리케이션/OSGi 서버는 데이터베이스/broker별 팩토리를 일반, 풀링, 인 목록에 포함된 팩토리로 래핑 합니다.
이러한 방식으로 애플리케이션 코드는 여전히 javax.sql.DataSource
및 javax.jms.ConnectionFactory
를 사용하지만 내부적으로 액세스하면 일반적으로 다음과 같은 추가 기능이 있습니다.
- 연결 풀링 - 매번 데이터베이스/메시지 브로커에 대한 새 연결을 생성하는 대신 사전 초기화된 연결 풀이 사용됩니다. 풀링 의 또 다른 측면은 예를 들어 연결의 주기적인 검증일 수 있습니다.
-
JTA 등록 -
java.sql.Connection
(JDBC) 또는javax.jms.Connection
(JMS)의 인스턴스를 반환하기 전에 실제 연결 개체가 실제 XA 리소스인 경우 등록됩니다. JTA 트랜잭션에서 등록이 가능한 경우 등록이 수행됩니다.
자동 목록을 사용하면 애플리케이션 코드를 변경할 필요가 없습니다.
JDBC 데이터 소스 및 JMS 연결 팩토리에 대한 래퍼 풀링 및 등록에 대한 자세한 내용은 6장. JDBC 데이터 소스 사용 및 7장. JMS 연결 팩토리 사용 를 참조하십시오.