반응형

 Datasource의 pool 관련 기본적인 아래의 설정들을 하게 된 후 실제 서비스에 적용하게 되면 몰려드는 요청 및 처리 시간 때문에 예상치 못한 문제들을 확인하게 됩니다.

<기본설정 예제>

datasource.driverClassName=com.mysql.jdbc.Driver

datasource.url=

datasource.username=

datasource.password=


 보통 요청에 대한 pool 을 관리하기 위해 개수를 조정하게 됩니다.

datasource.initialSize=4    # 커넥션 초기값

datasource.minIdle=4       # 유휴상태로 있을 수 있는 커넥션 최소값

datasource.maxActive=16 # 커넥션 최대값

datasource.maxIdle=16


 이러고 나면, DB 와의 연결 관련 문제들이 발생하게 된다. Validation-Query 설정이나 autoReconnect=true (url의 param 값으로들 많이 붙임) 설정을 하게 된다. 하지만 실제 지속적으로 트래픽이 있는 실환경과 사용과 연결이 거의 없는 테스트 환경은 각기 다르니 유의하기를 바라고 autoReconnect 옵션은 false 해 두기를 바랍니다.(라고 어디서 봄) 

datasource.validation-query=select 1 # DB마다 다름.

datasource.test-on-borrow=true        # 커넥션 사용 시 validation 쿼리를 호출하여 커넥션을 확인하는 기능을 사용할지 말지 여부

datasource.test-while-idle=true


 위와같이 했는데도 'Communications link failure' 같은 메시지를 확인하게 된다면, 사용하는 DB 의 timout 들을 확인하기 바란다.(주로 wait_timeout)

확인을 하고 evictor thread 설정을 해야 에러 메시지를 그만 보게 될 것입니다. DB  wait_timeout 보다 당연히 짧아야 할 것 입니다.

datasource.timeBetweenEvictionrunsMillis=60000 # 1000이 1초, thread 실행주기

datasource.minEvictableIdleTimeMillis=60000

datasouce.numTestsPerEvictionRun=4                      # thread 실행 시 처리될 커넥션 개수


※ Tip 자신의 서비스의 master / slave 마다 설정이 다를 수 있고 권한 때문에 DBA만 조회 가능한 환경이 있을 수 있으니 유의 바랍니다.

-- mysql 의 wait_timeout 확인 방법

SHOW GLOBAL VARIABLES LIKE '%timeout%';


-- mysql 에서 host 에서 접속한 연결 개수 확인 방법

SELECT *

  FROM INFOMATION_SCHEMA.PROCESSLIST

WHERE host = '' #

     AND db = ''

;


그 외에 일반적으로 같이 추가하는 설정들 입니다.

datasource.maxWait=5000 # 애플리케이션 레벨에서 DBCP pool의 커넥션을 획득하기 위해 기다리는 시간이니 주의하기 바람.


대략 이렇게 설정하고 서버의 하드웨어 및 서비스에 따라 적절히 값을 조정하면 될 것 같습니다.


※ 사용하는 dbcp1 / dbcp2 / tomcat-dbcp 에 따라 상이할 수 있으니 유의바랍니다.

반응형

+ Recent posts