[spring] MariaDB connection 끊김 문제 해결

공수정·2021년 11월 10일
0

spring

목록 보기
8/32
post-custom-banner
  • 문제상황
    서버를 실행하고 오랜시간이 지나면 웹페이지 동작시 500에러가 발생했다.
    에러 내용은 DB connection 관련된 내용으로 발생했는데, 새로고침만으로 해결이 되는 단순한 문제라 connection 시간이 문제인거같아 관련 설정을 찾아보았고, 찾아본 내용을 정리하려고 한다.

1. 해결방법

  1. wait_timeout 설정값 조회 및 변경하기
    1. wait_timeout이란?
      DB서버에서 연결을 끊어버리는 기준이 되는시간, idle 상태인 connection을 끊을 때까지 서버가 대기하는 시간
    2. wait_timeout은 DB서버에 접속해서 변경하면 되지만, 권장하지 않는 방법이다.
      1) 설정값 조회 : DB 서버 접속 후 아래 명령어 실행
      show variables like '%timeout
      2) wait_timeout 설정값 변경 (설정값 변경 후에는 DB 재시작 필요)
      • Command Line 명령어로 Parameter 설정값 변경
      set global wait_timeout = 대기시간(초)
      set session wait_timeout = 대기시간(초)
      • my.cnf 파일에서 설정값 변경(MariaDB의 경우는 50-server.cnf 파일)
      wait_timeout = 대기시간(초)
  2. DBCP 설정하기
    DBCP Connection Pool의 설정을 최적화 하여 해당 문제를 해결하는 방법이다.
    DBCP의 testWhileIdle와 validationQuery 설정을 활용한다.
    1. 설정 방법
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    	<property name="validationQuery" value="select 1 from dual" />
    	<property name="testWhileIdle" value="true" />
    	<property name="timeBetweenEvictionRunsMillis" value="130000" />
    </bean>
    1. 설정에 대한 설명

      설정설명
      testWhileIdletrue (default false)
      validationQueryselect 1
      timeBetweenEvictionRunsMillis3600000(1시간). validationQuery를 수행할 주기. Evictor 스레드가 동작하는 간격. (default -1. Evictor 스레드의 실행이 비활성화됨)

      참고 : initialSize와 maxActive, maxIdle, minIdle 항목은 동일한 값으로 설정하는 것을 권장

      위처럼 설정을 하면 1시간마다 validationQuery을 수행하면서 DB Connection Pool의 Idle 상태 전환을 사전에 방지해 DB 서버에서 Connection을 강제로 끊지 않도록 하는 것이다.
      단, DB Connection Pool의 갯수가 많은 경우 모든 Connection에 대해 Idle 상태 검증 및 ValidationQuery를 수행할 수 있도록 timeBetweenEvictionRunsMillis를 좀 더 짧게 선정하는 것을 권장

참고
1.MySql/MariaDB에서 발생하는 Connection 끊김 문제 해결하기
2. 전자정부 프레임워크에서 context-datasource.xml 작성 방법 및 설명

profile
계속해서 공부하는 개발자입니다 :)
post-custom-banner

0개의 댓글