본문 바로가기
Oracle

DBCP(Database Connection Pool) validationQuery 설정

by 상후 2022. 6. 18.
728x90
반응형

 

 

 

일정 시간 사용하지 않던 커넥션 풀을 다시 사용하려 할 때 지연되는 현상 해결

외부 데이터베이스와 연동을 하는 시스템에서 특정 시점부터 15분이 딜레이 되는 현상을 발견하여 해결하였습니다.

설정 정보나 코드는 변경되지 않았고, 갑자기 해당 현상이 발생했습니다.

 

발생 원인
- 딜레이 주기를 모니터링해보니 평균 2시간 이상 해당 커넥션 풀을 사용하지 않다가 처음 다시 사용하려고 할 때 15분 지연됨을 확인할 수 있었습니다.
- 딜레이 이후 짧은 주기로 재사용할 때는 지연 현상이 발생하지 않았고, 이를 근거로 시스템의 유휴 상태인 커넥션 풀을 외부 DBMS에서 close() 해주고 있거나, 재시도 시 지연되어 해당 현상이 발생한다고 판단하였습니다.

- 이를 해결하기위해  validationQuery를 주기적으로 호출하여 연결을 유지함으로써 해결할 수 있었습니다.

 

해결 방법
- validationQuery를 주기적으로 호출하여 연결을 유지할 수 있도록 사용하고 있는 apache dbcp 설정 변경

 

apache commons dbcp를 사용하고 있습니다.

 

Parameter Default Description
validationQuery    호출자에게 연결을 반환하기 전에 이 풀의 연결을 확인하는 데 사용할 SQL 쿼리입니다.

Oracle : SELECT 1 FROM DUAL
MySql : SELECT 1
testWhileIdle  false Evictor가 실행될 때 개체의 유효성을 검사할지 여부를 나타냅니다. 개체의 유효성 검사에 실패하면 풀에서 삭제됩니다.
timeBetweenEvictionRunsMillis  -1(미사용) 개체의 유효성을 검사하는 주기(Evictor 가 동작하는 간격)

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.user}" />
    <property name="password" value="${jdbc.password}" />
    
    <!-- validationQuery 활성화 -->
    <property name="validationQuery" value="SELECT 1 FROM DUAL"/>
    <property name="testWhileIdle" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="300000"/>
</bean>

 

 

외 다양한 설정 정보들이 많으므로 보다 상세한 사항은 아래 사이트를 참고하시면 좋을 것 같습니다.

- https://commons.apache.org/proper/commons-dbcp/configuration.html

- https://sjh836.tistory.com/148

 

 

 

 

 

 

 

728x90
반응형

댓글