Database ( DB )/Database

DBCP valicationQuery 설정

노루아부지 2021. 1. 31. 23:09

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

DB 세션이 끊어지는 경우 재접속 처리를 해야 다시 정상적인 서비스가 가능해집니다.

 

재접속 처리 방법 중에 autoReconnect=true 옵션이 있는데 이 옵션을 잘못 사용하는 경우 예상하지 못한 문제가 발생할 수 있습니다.

autoReconnect 옵션은 쿼리를 수행한 다음 DB 세션에 문제가 있으면 단순히 SQLException을 발생한 후 재접속 처리를 합니다. 문제는 트랜잭션 구동 환경에서 수행 중이던 트랜잭션은 롤백이 되어야 하고, 남은 트랜잭션은 수행되지 않아야 하는데 autoReconnect옵션은 이런 처리를 하지 않기 때문입니다. 따라서 데이터 정확성이 깨질 수 있습니다.

 

이런 문제를 해결하기 위해서는 autoReconnect=true인 경우에는 SQLException이 발생하는 경우에 해당 트랜잭션이 더 이상 진행되지 않도록 직접 예외처리를 해야 합니다. 따라서 autoReconnect 옵션 사용은 권장하지 않습니다.

 

권장되는 옵션은 validationQuery입니다.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="validationQuery" value="select 1"/>
</bean>


<Resource
    name="jdbc/livesearch"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="10"
    maxIdle="30"
    maxWait="10000"
    username="${jdbc.username}"
    password="${jdbc.password}"
    driverClassName="com.mysql.jdbc.Driver"
    url="${jdbc.url}"
    validationQuery="select 1"
/>

 

오라클의 경우에는 select 1 대신 select 1 from dual을 사용하면 됩니다.

728x90
loading