[Spring] 일정 시간 지나면 Connection Pool 연결 끊어짐(connection time out error)
문제
- 마지막으로 DB에 connection을 맺은 후 일정시간 사용이 없다보니 DB connection이 끊겼다.
원인
- connection이 연결된 이후 해당 connection이 close 없이 DBMS의 설정에 따른 일정 시간이 지나면 해당 connection을 종료시키게 된다.
(ex. Mysql은 8시간 request가 오지 않으면 강제적으로 connection을 닫아버린다. Mysql의 설정을 변경함으로써 값을 바꿀 수는 있지만, 좋은 방법은 아니라고 한다.)
- 문제는, 이렇게 종료된 connection을 dbcp의 connection pool에선 여전히 가지고 있는 상태이다. 이런 상황에서 DB 관련 프로그램이 호출되면 connection 관련 에러가 발생한다.
해결책
- java에서 DB를 사용하기 전에 해당 conneciton이 정상적인지 검사를 하도록 한다.(validationQuery)
- 특정 시간마다 validationQuery를 실행한다.
(참고. 오라클의 경우 validationQuery="select 1 from dual"
)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost:5432/postgres" />
<property name="username" value="postgres" />
<property name="password" value="rootpass" />
<!-- DB Pool이 생성이 되더라고 특정 시간 호출되지 않으면 DBMS 설정에 따라 연결을 끊어질 때 이 경우 DBCP를 사용했다면.. 다음과 같은 설정을 추가하면 연결을 유지시켜 준다. -->
<property name="validationQuery" value="select 1" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 1분 -->
</bean>
Leave a comment