본문 바로가기
DataBase/MySQL, MariaDB

Commons DBCP 설정값 알아보기

by ojava 2018. 8. 6.
반응형

SpringFramework에서 Mysql-connector를 사용하여 DB를 연결하고 있다.

apache.commons.dbcp.BasicDataSource Bean을 만들어서 설정값을 지정하는 데

각각의 설정값의 의미를 알아두면 좋을 듯 하여 정리한다.

 

 

아.. 물론 문제가 있어서 공부하다보니 정리하게 되었다고 한다. ^_ㅠ

 

 

 

 

Commons DBCP 설정값 알아보기

 

 

 

우선 현재 사용하고있는 Commons DBCP는, DB 연결을 위해 apache에서 제공하는 프로젝트의 한 종류다.

DB 연결에 사용되는 Connection Pool을 만들어 관리 및 공유할 수 있게 해주는 역할을 한다.

 

Common DBCP 1.x 관련 설정 값은 아래와 같다.

 

 

 Property Name

 Value

 비고 (Default)

 driverClassName

 com.mysql.jdbc.Driver

 MySql, Maria DB의 경우에 해당

 각자 DB에 맞는 jdbc driverClass 입력

 url

 DB 연결정보 입력

 

 username

 DB 연결정보 입력

 

 password

 DB 연결정보 입력

 

 initialSize

 최초로 커넥션을 맺을 때 Connection Pool에 생성되는 커넥션 개수

 Default : 0

 minIdle

 최소한으로 유지할 커넥션 개수

 Default : 0

 maxIdle

 사용한 커넥션을 풀에 반납 시 

 최대로 유지할 개수

 Default : 8

 maxActive

 동시에 사용할 수 있는 최대 커넥션

 Default : 8

 maxIdle과 대부분 일치시킨다.

 커넥션 개수와 관련된 가장 중요한 성능 요소

 maxWait

 커넥션 풀에 연결 가능 커넥션이 없을 경우 반납되는 커넥션을 대기하는 시간

(단위 : millisecond, 10,000ms = 10초)

 값을 설정하지 않는 경우 응답올때까지 대기

 testOnBorrow

커넥션 풀에서 커넥션을 얻어올 때

테스트 실행

default : true (그러나 false 권장)

유효성 검사 쿼리로, validationQuery에 쿼리가 설정되어 있어야 함.

 testOnReturn

커넥션 풀로 커넥션을 받환할 때 

테스트 실행

default : false

유효성 검사 쿼리로, validationQuery에 쿼리가 설정되어 있어야 함.

 testOnWhileIdle

커넥션 풀 안의 유휴 상태의 커넥션을 대상으로 테스트 실행

default : false

오랫동안 대기 상태인 커넥션이 끊어지는 것을 방지하기 위해 true로 설정하도록 권장

 timeBetweenEvictionRunsMillis

Evictor 스레드 동작 간격. 기본적으로 비활성화 되어 있다.

default : -1

 minEvictableIdleTimeMillis

Evictor 스레드 동작 시 커넥션의 유휴 시간을 확인해 설정 값 이상일 경우 커넥션을 제거

default : 30분 (1,800,000)

 validationQuery

select 1

DB 조회용으로 가장 간단한 쿼리를 설정

 

 

 

해당 설정을 알아보게 된 사연은 DB 연결이 간헐적으로 끊어진다는 데 있었다.

에러메시지는 Unable to connect to any of the specified MySQL hosts. 라고 뜨는데 한 서비스에서만 발생했다면

내 운영능력을 탓하겠다만 전체적으로 문제가 발생한 것으로 보아 DB 서버의 이상이었다.

 

여튼 일단은 운영 중인 사이트에서 문제가 발생했으니 이를 해결하기 위해 다양한 방안을 고민했다.

처음에는 DB 연결 정보가 변경되었는지를 의심했고 세션수 등이 초과되어 그런 것이 아닐까 했는데

기본적인 설정은 최초 세팅 이후 대부분 변경하지 않기 때문에 이것도 아니었고

세션수도 안정적인 상태일 때 발생해서 예상했던 모든 문제가 아니었다.

 

결과적으로 해결 방법부터 이야기하자면 minEvictableIdleTimeMillis의 값을 -1로 두어 커넥션 풀의 커넥션을 제거하지 않도록 했다.

커넥션의 유휴시간에 따라 제거하는 일이 없으니 계속 유휴상태로 남아있고

해당 커넥션을 가져다가 사용할 수 있으므로 그 이후로는 에러가 발생하진 않았다.

 

 

 

다양한 설정값을 변경해보았다.

 

1. maxActive와 maxIdle를 일치시키는 부분

해당 설정의 경우를 예를 들어보자면, maxActive (최대 커넥션) 이 20이고 maxIdle이 10인 경우 20개까지 생성된 커넥션 중 10개만 유휴 커넥션으로 남아있을 수 있고, 나머지 10개의 커넥션은 작업을 끝내고 바로 제거된다.

유후 커넥션 10개를 모두 사용하고 그 이후에 커넥션이 더 필요한 경우 새롭게 DB 커넥션을 맺게 되고 작업이 끝난뒤 제거되는 과정이 반복된다.

 

이 경우는 이미 맞춰져 있었으므로 패스

 

2. timeBetweenEvictionRunsMillis 시간 줄이기

유효한 커넥션인지를 확인하기 위해 동작하는 Evictor 스레드를 얼마나 자주 동작하게 할 것인지 설정하는 부분

300,000이라고 맞춰져 있었다면 5분마다 커넥션 유효성여부를 체크하도록 했을 것이다.

이 때 validationQuery를 사용해서 커넥션 유효여부를 체크하게 된다.

☆testOnWhileIdle 값이 true 여야만 체크를 진행한다☆

 

커넥션 자체에 문제가 있다는 가정하에 시간을 줄여보았으나, 큰 의미가 없었다.

 

3. minEvictableIdleTimeMillis 사용하지 않도록 변경

최종적으로 변경한 설정이고 이 설정으로 인해 더 이상 문제는 발생하지 않았다.

2번에서 설정한 내용이 커넥션의 유효여부를 체크하는 것이라면, 이 설정의 경우는 커넥션의 유휴시간을 체크하여 얼마 이상동안 사용되지 않은 커넥션을 제거하는 역할을 한다.

커넥션 숫자가 매우 많아서 계속해서 줄여나가야 하는 상황이 아니었고 언제든 사용자가 들어와서 빠르게 DB 연결하여 데이터를 확인할 수 있는 사이트를 구성하고자 했으므로 해당 설정을 -1로 하여, 유휴시간 체크를 하지 않도록 했다.

 

 

 

결과적으로는 설정값을 모두 알고있어야 한다. 는 좋은 결론을 내렸다.

이 문제가 발생했을 때 설정변경을 안했다면 꼭 DB 서버를 우선적으로 확인해보고 본인 설정을 고치기 바란다.

 

이번 기회로 DBCP 설정값을 많이 배웠다. 그래도 다시 문제는 안 생겼으면 좋겠다.

 

 

* 포스팅 참고 문헌

 

apache DBCP Component

https://commons.apache.org/proper/commons-dbcp/

 

설정 변경 및 관련 내용 이해에 정말 많은 도움이 되었던 네이버 개발자 블로그

Common DBCP 1.x 와 2.x 버전 차이에 대한 설명도 아주 잘 되어 있다.

http://d2.naver.com/helloworld/5102792

 

 

반응형