카테고리 없음

[DBCP] isValid() returned false

용마마 2020. 1. 14. 16:20

DBCP (isValid() returned false)

DB connection 시 연결의 유효성을 검사한다.

연결이 유효하면 true이고, 연결이 유효하지 않거나 제한 시간이 만료되기 전에 연결의 유효성을 확인할 수 없으면

false를 return 한다.

 

문제 발생

- 하루에 한 번 특정 시간에 실행이 되는 배치가 있었는데, 항상 배치가 실행될 때 isvalid() return false를 여러 번 return 후 connection이 맺어지는 현상이 발생.

 

원인

- SHOW VARIABLES LIKE '%timeout' 

  확인해본 결과 wait_timeout이 28800초(8시간)로 설정되어 있었고, 28800초 이후 커넥션이 끊기고 배치가 실행

  되면서 connection을 다시 맺을때 isValid() returned false가 발생.

 

ex) 1일 오전 6시 job 실행 -> 14~15시 커넥션이 끊김 -> 2일 오전 6시 job실행 isValid() return false

 

* wait_timeout  :   활동하지 않는 커넥션을 끊을 때까지 서버가 대기하는 시간 (php, jdbc 등을 통한 CONNECTION)
* interactive_timeout  :  활동중인 커넥션이 닫히기 전까지 서버가 대기하는 시간 (mysql command line)

 

 

해결

datasource set validation Query 

validationQuery -> 커넥션이 유효한지 확인할때 사용하는 쿼리 설정 (보통 mysql은 SELECT 1)

testWhileIdle -> 풀에 있는 커넥션이 유효한지 검사 유무 true로 줘야 validationQuery가 실행됨

timeBetweenEvictionRunsMillis -> SELECT 1 유휴 커넥션 검사 주기 설정 

 

validationQuery 설정 이후 주기적으로 커넥션 검사를 하여 더 이상 isValid() return false가 나타나지 않았다.