본문 바로가기

Dev.../플밍 관련 자료

[펌] Re: 2-phase commit XA JDBC Driver

1. 일정 시간이 지난 후에 "connection is closed"가 발생하는 가장 추정가능한 부분은
JDBC Connection Pool에 남아 있는 일부 connection이 물리적으로 일정 시간 후에
TCP/IP 혹은 방화벽, 혹은 Database의 idle timeout에 걸려 사실상 단절 되었음에도
불구하고, WebSphere의 Connection Pool에서 그 reference를 여전히 갖고 있을 수 있는데,
이 잘못된 connection을 응용어플리케이션이 사용할 경우에 conn.createStatement()혹은
conn.prepareStatement()시점에 StaleConnectionException: connection is closed 에러를
만나게 됩니다.

이 부분을 해결하는 하는 방법은 WebSphere와 Database사이에 존재할 수 있는 여하한의
Idletimeout을 조사/검토하신 후, WebSphere의 JDBC DataSource에 기술되어 있는
Idletimeout(유휴대기시간?) 값을 default 30분(1800초)에서 10분(600초)로 줄여보세요.
또한, 사용되지 않으면서 과도하게 min connection이 높게 책정되어 있다면, 낮추어
주세요.

2. 이기종(heterogeneous) 데이타베이스 간의 2-phase commit이 보장되는 XA(X/Open
Architecture) 프로토콜을 지원하는  자바의 표준 아키텍쳐는 JTS(Java Transaction
Service)/JTA(Java Transaction Architecture) 입니다. 또한 각 데이타베이스는
XA JDBC Driver를 제공/지원해야 하고, WebSphere에서는 해당 XA JDBC Driver를 이용하여
"JDBC 드라이버"를 추가/설정할 수 있으며, 이 XA JDBC Driver를 통해 생성할 수 있는
2PC XA용 DataSource를 만드실 수 있습니다.
InitailContext lookup()를 통해 해당 DataSource의 reference를 얻고 ds.getConnection()을
통해 java.sql.Connection을 응용어플리케이션에서 구하게 되면, Connection에서 명시적인
conn.commit()/rollback() API를 사용하시는 것이 아니라, JTA 스펙에 명시되어 있는
UserTransaction의 tx.start()/commit()/rollback() API를 사용하셔야 합니다.
(첨부된 2pc.jsp 참조하세요)

이기종 데이타베이스간의 2-phase commit 요건이 필요없다면, 굳이 XA JDBC Driver를
사용치 마시고, 일반(?) non-XA JDBC Driver를 통해 DataSource를 사용하면 됩니다.
non-XA JDBC Driver를 사용할 때, 명시적인 conn.setAutoCommit(false), conn.commit()
/rollback()을 사용할 수 있는 것이지요.

JTA설정여부는 WebSphere V3.5 까지는 checked box가 존재했지만, V4 이후부터는 JDBC
Implementation Class가 무엇이냐에 따라 결정됩니다. XA 및 nonXA JDBC Driver의 유형
및 설정방법은 데이타베이스 및 WebSphere Version마다 다른 만큼, 관련 HandBook을
통해 확인해 보세요.

자바서비스넷 이원영