전자정부프레임워크로 웹 개발을 하다보면 주말이 지나서 로그인을 하려고 할때 접속이 안되는 증상이 발생하게 됩니다.
처음에는 로그인 버튼을 두번째 누르면 접속이 되니까 그려려니 하고 넘어갔죠.
그러다 반복적인 문제로 인식이 되어 시연을 하는 시점에서 접속이 바로 안되고 동작에 오류가 있는 듯이 멈춰 버려서 난감하게 되었습니다.
구글에 바로 검색을 해보았습니다.
jsp db connection 끊어짐
역시 저와 비슷한 사람들이 많이 있었습니다.
하지만 전자정부프레임워크에서 물어보는 사람이 없어서 따로 정리합니다.
[원인]
Tomcat 이 MySQL과 연결이 되어 있다가 시간이 지나면 오래된 Connection을 문제로 인식하여 자동으로 접속을 해제합니다.
[해결방법]
DB와의 연결시 Connection 상태의 유효성 검사를 먼저 진행한디ㅏ.
1. 수정할 곳을 검색합니다.
- 프로젝트에서 dataSource-mysql을 검색합니다.
<!-- MySQL -->
<bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
</bean>
- 위와 같은 코드를 발견합니다.
2. 추가 사항을 입력합니다.
<!-- MySQL -->
<bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
<property name="validationQuery" value="select 1 from dual" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="600000" />
</bean>
validationQuery : connection 유효성 검사시에 사용할 쿼리문으로 DB 리소스를 적게 소모하는 쿼리가 좋습니다.
testWhileIdle : connection의 유효성 검사 여부를 물어봅니다.
timeBetweenEvictionRunsMillis : 사용하지 않는 connection을 pool에서 제거하는 기준시간으로 기본값은 -1이고 1000이 1초이다.
이와 같이 추가 후에 저장을 빠악!!
그 이후로 다음날 아침에 접속해도 잘 접속되는걸 확인 할 수 있습니다.
이번에도 또 이것 때문에 시연할때 접속안되서 하아..
다음부터는 무조건 개발할때 이것먼저 설정하는게 감정소모 안할것 같다는 생각.