속성 | 설명 |
maxActive | 커넥션 풀이 제공할 최대 커넥션 개수 |
whenExhaustedAction | 커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 어떻게 동작할지를 지정한다. 1일 경우 maxWait 속성에서 지정한 시간만큼 커넥션을 구할 때 까지 기다리며, 0일 경우 에러를 발생시킨다. 2일 경우에는 일시적으로 커넥션을 생성해서 사용한다. |
maxWait | whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간. 단위는 1/1000초이며, 0 보다 작을 경우 무한히 대기한다. |
maxIdle | 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 개수. 음수일 경우 제한이 없다. |
minIdle | 사용되지 않고 풀에 저장될 수 있는 최소 커넥션 개수. |
testOnBorrow | true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사한다. |
testOnReturn | true일 경우 커넥션 풀에 커넥션을 반환할 때 커넥션이 유효한지의 여부를 검사한다. |
timeBetweenEvctionRunsMillis | 사용되지 않은 커넥션을 추출하는 쓰레드의 실행 주기를 지정한다. 양수가 아닐 경우 실행되지 않는다. 단위는 1/1000 초이다. |
numTestsPerEvictionRun | 사용되지 않는 커넥션을 몇 개 검사할지 지정한다. |
minEvictableIdleTimeMillis | 사용되지 않는 커넥션을 추출할 때 이 속성에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출한다. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않는다. 시간 단위는 1/1000초이다. |
testWhileIdle | true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거한다. |
몇몇 속성은 성능에 중요한 영향을 미치기 때문에 웹 어플리케이션의 사용량에 따라서 알맞게 지정해주어야 하는데, 다음과 같이 고려해서 각 속성의 값을 지정하는 것이 좋다.
- maxActive - 사이트의 최대 커넥션 사용량을 기준으로 지정. 동시 접속자수에 따라서 지정한다.
- minIdle - 사용되지 않는 커넥션의 최소 개수를 0으로 지정하게 되면 풀에 저장된 커넥션의 개수가 0이 될 수 있으며, 이 경우 커넥션이 필요할 때 다시 커넥션을 생성하게 된다. 따라서 커넥션의 최소 개수는 5개 정도로 지정해두는 것이 좋다.
- timeBetweenEvctionRunsMillis - 이 값을 알맞게 지정해서 사용되지 않는 커넥션을 풀에서 제거하는 것이 좋다. 커넥션의 동시 사용량은 보통 새벽에 최저이며 낮 시간대에 최대에 이르게 되는데 이 두 시간대에 필요한 커넥션의 개수 차이는 수십개에 이르게 된다. 이때 최대 상태에 접어들었더가 최소 상태로 가게 되면 풀에서 사용되지 않는 커넥션의 개수가 점차 증가하게 된다. 따라서 사용되지 않는 커넥션은 일정 시간 후에 삭제되도록 하는 것이 좋다. 보통 10~20분 단위로 사용되지 않는 커넥션을 검사하도록 지정하는 것이 좋다.
- testWhileIdle - 사용되지 않는 커넥션을 검사할 때 유효하지 않은 커넥션은 검사하는 것이 좋다.
관련링크:
출처 - http://javacan.tistory.com/82
DB Connection Pool을 사용하기 위해서 Apache Commons의 dbcp를 많이 사용하고 있지만 매번 설정값에 대한 정확한 정의와 설정방법을 까먹는 경향이 있어 일반적인 설정값 가이드를 아주 간단히 정리하고자 한다.
maxActive (최대 active connection 개수??)
+ 그냥 최대 Connection 개수로 생각하면된다. + 기본값은 8이며, 적당히? 설정하면 된다. |
minIdle
+ 사용되지 않고 풀에 저장될 수 있는 최소 커넥션 개수 + 기본값은 0이며, 기본값을 사용하게 되면 connection pool이 비어버릴 수 있기 때문에 기본값 대신 적당한 설정이 필요하다. |
maxIdle
+ 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 개수 + 기본값은 8이며, 일반적으로 maxActive 개수와 동일하게 설정하는게 맞는 것 같다 |
maxWait
+ connection 사용이 많아져서 connection pool이 비었을 때 대기시간 (단위 1/1000초) + 기본값은 -1(무한대)이며, 서비스 특성에 맞게 설정하면된다. 일반적으로 기본값을 사용해도 큰 문제는 안될 것 같다. |
testOnBorrow
+ connection pool에서 connection을 가져올 때 해당 connection이 유효성 검사 여부 + 기본값은 false이며, 일반적으로 기본값을 사용한다. true설정하게 되면 매번 validationQuery를 수행하기 때문에 약간의 성능저하를 감수해야 한다. |
testOnRetrun
+ testOnBorrow와 비슷한데... 다만 유효성 검사 시점이 connection을 pool에 반환할때 이다. |
timeBetweenEvictionRunsMillis
+ 놀고 있는 connection을 pool에서 제거하는 시간기준 (설정된 시간동안 놀고 있는 connection을 minIdle&maxIdel 설정값을 고려하여 제거한다.) + 기본값은 -1이며, 단위는 1/1000초이다. 개인적으로 10분정도의 설정이 적당한 것 같다. |
testWhileIdle
+ 놀고 있는 connection의 제거 여부를 검사할 때 해당 connection의 유효성 테스트 여부 + 기본값은 false이며, 일반적으로 true로 설정하는 것이 좋은 것 같다. |
validationQuery
+ connection 유효성 검사시에 사용할 쿼리문 + DB 리소스를 최대한 적게 사용하는 쿼리를 사용하는게 좋다. 예제) * Oracle : select * from dual * MySql : select 1 |
======================================================================================
Tomcat7 tomcat-jdbc 설정 - Broken pipe 에러 회피
tomcat-jdbc로 MySQL에 연결한 경우 "java.net.SocketException: Broken pipe" 에러가 발생하는 경우를 가끔 볼 수 있다. 대부분의 경우 connection idle time이 MySQL에 설정된 wait_timeout을 지나서 DB에서 연결을 끊은 것이다. 이를 방지하려면 connection이 일정 기간동안 사용되지 않으면 close되도록 설정하거나 connection 대여시에 connection을 체크하도록 하면 된다.
설정 1 - 일정 기간동안 사용되지 않으면 connection을 테스트
validationQuery="SELECT 1"
testWhileIdle="true"
minEvictableIdleTimeMillis="3600000"
timeBetweenEvictionRunsMillis="60000"
(*) DB에 쿼리를 하기 때문에 이 때마다 DB의 session idle time이 갱신된다. 만약 connection이 이미 끊겼다면 에러가 발생할테고 해당 connection은 pool에서 제거된다.
(*) timeBetweenEvictionRunsMillis의 기본값은 5000 (5초)이고, minEvictableIdleTimeMillis의 기본값은 60000 (60초)이다. minEvictableIdleTimeMillis 값은 MySQL에 설정된 wait_timeout이나 방화벽에 설정된 session timeout 값보다 작아야 한다.
설정 2 - connection 대여 시 테스트
validationQuery="SELECT 1"
testOnBorrow="true"
(*) 매번 connection 대여 시 마다 체크하는 것은 아니다. 체크 한 connection은 validationInterval 기간 안에는 다시 체크하지 않는다. validationInterval의 기본값은 30000 (30초).
설정 3 - 일정 기간동안 사용되지 않으면 connection을 close
minIdle="0"
설정 1을 사용한 JDBC Resource 설정 예
context.xml |
<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/smartconnect?useUnicode=true&characterEncoding=utf8" username="username" password="password" initialSize="10" minIdle="10" maxIdle="50" maxActive="50" maxWait="5000" validationQuery="SELECT 1" validationInterval="30000" testWhileIdle="true" /> </Context> |
tomcat-jdbc PoolCleaner 동작
PoolCleaner thread는 timeBetweenEvictionRunsMillis 만큼 sleep하다 idle/abandoned connection을 체크한다.
- removeAbandoned="true"이면 abandoned connection 체크
- connection이 대여된 후 removeAbandonedTimeout (초, 기본값 60)안에 반납되지 않으면 connection을 pool에서 제거하고 close한다.
- pool의 idle connection 개수가 minIdle보다 크면 체크
- idle connection 개수가 minIdle이 될 때 까지 마지막 사용시간이 minEvictableIdleTimeMillis (기본값 60000)을 지난 idle connection을 찾아 pool에서 제거하고 close한다.
- testWhileIdle="true"이면 idle connection들에 대해 validation 테스트
- 전체 idle connection에 대해 validationQuery에 설정된 SQL을 수행해서 Exception이 발생하면 pool에서 제거하고 close한다.
MySQL wait_time 설정값 확인 방법 (단위: 초)
mysql>select @@global.wait_timeout;
+-----------------------+
| @@global.wait_timeout |
+-----------------------+
| 28800 |
+-----------------------+
1 row in set (0.00 sec)
[출처] Tomcat7 tomcat-jdbc 설정 - Broken pipe 에러 회피|작성자 소프
http://blog.naver.com/clotho95?Redirect=Log&logNo=140142861915
maxActive - 연결할 커넥션의 최대 갯수
maxIdle - 풀에 대기시킬 커넥션의 최대 갯수
minIdle - 풀에 대기시킬 커넥션의 최소 갯수
(0은 놀고있는 커넥션을 풀에 간직하지 않고 모두 close함을 뜻한다)
당연히 maxActive 값보다 maxIdle 값은 적어야 하며
maxIdle 보다 minIdle 값은 또 적어야 한다.
minIdle 을 0이상 잡을 경우
DB의 일방적인 세션 끊김을 방지하는 차원으로
testWhileIdle="true" 의 validation 속성을 추가로 설정하는것이 좋다.
'Server > was' 카테고리의 다른 글
JEUS WAS 한글 인코딩 (1) | 2016.08.11 |
---|---|
JEUS 1.6 기동오류 (0) | 2015.11.06 |
Tomcat 현재 열려 있는 Connection pool 개수 조회 (0) | 2015.10.12 |