MySQL2020. 11. 4. 13:55

 

 

MySQL은 기본적으로 커넥션이 8시간동안 요청이 없으면 커넥션을 해지하고

풀링을 해지하게 된다. (기본 wait_timeout이 28800)


예를들자면 장시간 접속을 하지 않은 홈페이지의 경우 DB 커넥션이 해지되어 정상적으로 홈페이지 이용을 하지 못하는 경우가 생길 수 있으며, 다른 MySQL을 이용하는 프로젝트에서도 시간이 지나면 이런 상황이 발생할 수 있다.
(8시간동안 한명도 접속하지 않는 홈페이지..주륵ㅜ)

나도 처음에 Spring 프로젝트로 만든 홈페이지가 다운되어 로그를 추적했었는데,
JDBCConnectionException이 발생하여 해당 문제를 알게되었다. 해결책을 공부해서 다시 수정해 적용하고, 기록해두기 위해 포스팅을 올린다.


해결책 1)
JDBC 연결시 주소에 "autoReconnect=true"라는 옵션을 추가해준다.

 

url="jdbc:mysql://llocalhost:3306/test?autoReconnect=true"

 

커넥션에 문제 발생시 재접속을 자동으로 하게 해줌으로써 문제를 해결할 수 있다. 가장 편한 방법이다.

 

 


해결책 2)
tomcat + spring 프레임워크를 이용하는 경우 DBCP 설정에서 config에 validationQuery를 넣어 해결한다.

 

<!-- MySQL Datasource 설정 -->
	<bean id="mysqlDS" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
		<property name="uniqueResourceName" value="mysqlXADS"/>
		<property name="xaDataSourceClassName" value="${jdbc.mysql.xaDriver}"/>
		<property name="xaProperties">
			<props>
				<prop key="user">${jdbc.mysql.username}</prop>
				<prop key="password">${jdbc.mysql.password}</prop>
				<prop key="url">${jdbc.mysql.url}</prop>
			</props>
		</property>
		<property name="validationQuery" value="select 1"/>
		<property name="poolSize" value="${jdbc.mysql.poolSize}"/>
	</bean>

 

 

validationQuery는 "SELECT 1" 정도로 넣는다.
확인 쿼리를 넣어서 해결하는 방법인데, 이 방법의 단점은 커넥션 연결전에 매번 검증을 하기때문에 속도가 중요한 시스템의 경우 사용을 고려해야한다.

또한 /etc/my.cnf 에서 설정하는 방법 등 여러가지 방법이 있는데..가장 대표적인 2방법만 기술하였다.

 

Posted by 사슴영혼'-'