본문 바로가기
[프로그래밍]/BackEnd

Tomcat7 tomcat-jdbc 설정 - Broken pipe 에러 회피

by control+c 2015. 4. 6.
반응형

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&amp;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 에러 회피|작성자 소프



반응형

댓글