DBCP validationQuery 설정

2018. 7. 11. 14:31 JAVA/DBCP,JNDI,JDBC

DBCP validationQuery 설정

* 참고 사이트: http://linuxism.tistory.com/579
* 참고 사이트: Configuring the High Concurrency JDBC Connection Pool
* 참고 사이트: DBCP 설정 정리

에러 메시지 일부분
 - is longer than the server configured value of 'wait_timeout'.

원인 
 - 마지막으로 DB에 커넥션을 맺은후 사용이 없다 보니 데이터 베이스 커넥션이 끝겼다. 

해결책
 - 특정 시간마다 커넥션을 확인 하는 셋팅을 지정한다. 

적용 코드
 - MySQL
  • validationQuery="select 1"

 - 오라클의 경우
  • validationQuery="select 1 from dual"


상세 설명
mysql wait_timeout 설정(기본값 28800 , 8시간) 에 의해 커넥션이 연결된 이후 해당커넥션의 close 없이 8시간이 지나면 해당 커넥션을 종료 시키게 된다.
문제는 이렇게 종료된 커넥션을 dbcp의 connection pool 에선 여전히 가지고 있는 상태라는 것이다.이런 상황에서 DB 관련 프로그램이 호출되면 커넥션 관련 에러가 발생된다.
해결방법은 java에서 DB를 사용하기 전에 해당 connection 이 정상적인지 검사를 하도록 하는 것이다. 이 옵션이 validationQuery 파라미터이다.

* 추가 작업
 - timeBetweenEvctionRunsMillis - 사용되지 않는 커넥션을 추출하는 쓰레드의 실행 주기를 지정
    이값을 알맞게 지정해서 사용되지 않는 커넥션을 제거하는것이 좋다 보통 10~20분 단위 검사

 - testWhileIdle - true 일 경우 비활성화 커넥션을 추출할때 커넥션이 유효한지 여부를 검사해서 유효하지 않으면 제거


추가 적용 코드
  • validationQuery="select 1"
  • testWhileIdle="true"   
  • timeBetweenEvictionRunsMillis="30000"
 - testWhileIdle:컨넥션이 놀고 있을때, validationQuery 를 이용해서 유효성 검사를 할지 여부.
 - timeBetweenEvictionRunsMillis:해당 밀리초마다 validationQuery 를 이용하여 유효성 검사 진행.

* 더 추가 작업
 - 이렇게 설정하면 컨넥션을 풀에서 가져 올때도, validationQuery를 통해서 유효성 검사를 진행하게 되는데
 - 퍼포먼스가 문제 될거라고 생각된다면 testOnBorrow( default : true ) 값을 false 로 추가해주면 된다.
 - testOnBorrow : true일 경우 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사.