본문 바로가기

DB

[MyBATIS(MySQL)] JDBC autoReconnect=true 옵션 사용시 유의사항

DB에 접속중인 세션을 오랫동안 사용하지 않거나, 네트워크에 문제가 발생하는 경우 DB 세션이 끊어질 수 있다.

DB 세션이 끊어지는 경우 App 입장에서는 재접속 처리를 해주어야 다시 정상적인 서비스가 가능해 진다.

재접속 처리 방법 중에 JDBC에 autoReconnect=true 옵션을 주는 방법이 있는데, 이 옵션을 잘못 사용하는 경우 얘기치 않은 문제가 발생할 수 있다.

autoReconnect 옵션은 쿼리를 수행한 다음 DB 세션에 문제가 있으면 단순히 SQLException 리턴 후 재접속 처리를 한다.

문제는 트랜잭션 구동 환경에서  수행중이던 트랜잭션은 롤백이 되어야 하고, 남은 트랜잭션은 수행이 되지 않아야 되는데, autoReconnect 옵션은 이런 처리를 해주지 않기 때문이다.


트랜잭션을 사용하는 환경이라면 DB 세션의 재접속 처리는 JDBC의 autoReconnect 설정이 아닌 DBCP의 validationQuery 기능을 사용하는 것이 적합하다.

<bean id="dataSourceSpied" class="org.apache.ibatis.datasource.pooled.PooledDataSource">

<property name="driver" value="${jdbc.driverClassName}"></property>

<property name="url" value="${jdbc.url}"></property>

        <property name="username" value="${jdbc.username}"></property>

        <property name="password" value="${jdbc.password}"></property>

        <property name="poolPingEnabled" value="true"/> <!-- 커넥션 ping 테스트 -->

        <property name="poolPingQuery" value="select 1"/> <!-- 커넥션이 살아 있는지 확인할 쿼리 -->

        <property name="poolPingConnectionsNotUsedFor" value="43200"/> <!-- 어떤 커넥션이 닫힐 상태인지 판단하는 기준시간 -->

        <property name="poolTimeToWait" value="30000"/><!-- 사용 불가능한 커넥션 기다리는 시간 -->

</bean>


dataSource


dataSource 요소는 표준 JDBC DataSource 인터페이스를 사용하여 JDBC Connection 객체의 소스를 설정한다.

대부분의 MyBatis 애플리케이션은 예제처럼 dataSource를 설정할 것이다.

여기엔 3가지의 내장된 dataSource 타입이 있다.


UNPOOLED – 이 구현체는 매번 요청에 대해 커넥션을 열고 닫는 간단한 DataSource이다. 조금 늦긴 하지만 성능을 크게 필요로 하지 않는 간단한 애플리케이션을 위해서는 괜찮은 선택이다. UNPOOLED DataSource 는 5개의 프로퍼티만으로 설정된다.

driver – JDBC 드라이버의 패키지 경로를 포함한 결제 자바 클래스명

url – 데이터베이스 인스턴스에 대한 JDBC URL.

username – 데이터베이스에 로그인 할 때 사용할 사용자명

password - 데이터베이스에 로그인 할 때 사용할 패스워드

defaultTransactionIsolationLevel – 커넥션에 대한 디폴트 트랜잭션 격리 레벨

필수는 아니지만 선택적으로 데이터베이스 드라이버에 프로퍼티를 전달할 수 도 있다. 그러기 위해서는 다음 예제처럼 “driver.” 로 시작하는 접두어로 프로퍼티를 명시하면 된다.

driver.encoding=UTF8

이 설정은 “encoding” 프로퍼티를 “UTF8”로 설정하게 된다. 이 방법외에도 DriverManager.getConnection(url, driverProperties) 메서드를 통해서도 프로퍼티를 설정할 수 있다.


POOLED – DataSource에 풀링이 적용된 JDBC 커넥션을 위한 구현체이다. 이는 새로운 Connection 인스턴스를 생성하기 위해 매번 초기화하는 것을 피하게 해준다. 그래서 빠른 응답을 요구하는 웹 애플리케이션에서는 가장 흔히 사용되고 있다.

UNPOOLED DataSource에 비해, 많은 프로퍼티를 설정할 수 있다.

poolMaximumActiveConnections – 주어진 시간에 존재할 수 있는 활성화된(사용중인) 커넥션의 수. 디폴트는 10이다.

poolMaximumIdleConnections – 주어진 시간에 존재할 수 있는 유휴 커넥션의 수

poolMaximumCheckoutTime – 강제로 리턴되기 전에 풀에서 “체크아웃” 될 수 있는 커넥션의 시간. 디폴트는 20000ms(20초)

poolTimeToWait – 풀이 로그 상태를 출력하고 비정상적으로 긴 경우 커넥션을 다시 얻을려고 시도하는 로우 레벨 셋팅. 디폴트는 20000ms(20초)

poolPingQuery – 커넥션이 작업하기 좋은 상태이고 요청을 받아서 처리할 준비가 되었는지 체크하기 위해 데이터베이스에 던지는 핑쿼리(Ping Query). 디폴트는 “핑 쿼리가 없음” 이다. 이 설정은 대부분의 데이터베이스로 하여금 에러메시지를 보게 할수도 있다.

poolPingEnabled – 핑쿼리를 사용할지 말지를 결정. 사용한다면, 오류가 없는(그리고 빠른) SQL 을 사용하여 poolPingQuery 프로퍼티를 셋팅해야 한다. 디폴트는 false이다.

poolPingConnectionsNotUsedFor – poolPingQuery 가 얼마나 자주 사용될지 설정한다. 필요이상의 핑을 피하기 위해 데이터베이스의 타임아웃 값과 같을 수 있다. 디폴트는 0이다. 디폴트 값은 poolPingEnabled 가 true일 경우에만, 모든 커넥션이 매번 핑을 던지는 값이다.


JNDI – 이 DataSource 구현체는 컨테이너에 따라 설정이 변경되며, JNDI 컨텍스트를 참조한다. 이 DataSource는 오직 두개의 프로퍼티만을 요구한다.

initial_context – 이 프로퍼티는 InitialContext 에서 컨텍스트를 찾기(예를 들어, initialContext.lookup(initial_context)) 위해 사용된다. 이 프로퍼티는 선택적인 값이다. 이 설정을 생략하면, data_source 프로퍼티가 InitialContext 에서 직접 찾을 것이다.

data_source – DataSource 인스턴스의 참조를 찾을 수 있는 컨텍스트 경로이다. initial_context 룩업을 통해 리턴된 컨텍스트에서 찾을 것이다. initial_context 가 지원되지 않는다면, InitialContext 에서 직접 찾을 것이다.

다른 DataSource 설정과 유사하게, 다음처럼 “env.” 를 접두어로 프로퍼티를 전달할 수 있다.

env.encoding=UTF8

이 설정은 인스턴스화할 때 InitialContext 생성자에 “encoding” 프로퍼티를 “UTF8” 로 전달한다.

 

'DB' 카테고리의 다른 글

[MySQL] 데이터베이스 생성  (0) 2014.10.28
데이터베이스 프로그래밍 기초  (0) 2014.10.28