jdbc driver 명

mysql의 connectTimout,

socketTimeout 에 해당되는 값

기본값

단위

적용방법

Oracle Thin Driver

* connectTimout :  oracle.net.CONNECT_TIMEOUT

* socketTimout :  oracle.jdbc.ReadTimeout

0

(무한대기)               

밀리세컨드(ms) 

driver단에서 사용불가하고, dbcp 설정에서 사용

<property name="connectionProperties"
value="
oracle.net.CONNECT_TIMEOUT=6000;

oracle.jdbc.ReadTimeout=6000"/>

MS-SQL Server

(jTDS Driver)

* connectTimout :  

loginTimeout

* socketTimout :  

socketTimeout

0

(무한대기)  

초 (second)

 

driver단에서 사용가능

jdbc:jtds:sqlserver://server:port/database;

loginTimeout=60;

socketTimeout=60

MYSQL Driver

* connectTimout :  

connectTimeout

* socketTimout : 

socketTimeout

0

(무한대기) 

밀리세컨드(ms) 

사용 가능

jdbc:mysql://xxx.xx.xxx.xxx:3306/database?
 
connectTimeout=60000&

socketTimeout=60000

Cubrid

Thin Driver

조정 불가능

5

 

 

 

만약 우리가 관리하고 있는 서버에서 설정을 하지 않았다면 계속 무한대기 상태로 있을까요?

OS 레벨에서는 tcp 레벨 단위의 socket timeout 이 있는데요.  이 값에 영향을 받습니다.

리눅스의 경우는 커널 파라미터라고 그 값을 볼수도 바꿀 수 있습니다.

 

tcp_keepalive_time 파라미터는 " keepalive 가 활성되 되어 있을 경우, 얼마나 자주 TCP 가 keepalive 메세지를 보내게 할 것인지를 설정."에 대한 값을 정의합니다.  tcp_fin_timeout은 "tcp fin 패킷에 대한 timeout"이며, tcp_syn_retries 는 "tcp syn 패킷을 몇번이나 시도할 것이냐"에 대한 값입니다. 이 모든 값은 os level 단의 timeout에 큰 영향을 미칩니다.

 

자세히 보도록 하겠습니다.

ubuntu 설정으로는 7200초 (2시간)이 디폴트값입니다.

cat /proc/sys/net/ipv4/tcp_keepalive_time
7200


/proc/sys/net/ipv4/tcp_keepalive_intvl/와 /proc/sys/net/ipv4/tcp_keepalive_probes 의 값과 함께 계산되어 timeout이 될 때, 상당히 긴 시간동안 timeout 이벤트가 일어나지 않을 가능성이 높으니, db에 대한 timeout은 반드시 지정될 필요가 있습니다.

 

tcp fin 패킷을 못받는 경우에 대한 timeout은 60초 (1분)입니다.

cat /proc/sys/net/ipv4/tcp_fin_timeout
60

 

tcp syn 패킷에 대한 시도는 5번이나 합니다.  

cat /proc/sys/net/ipv4/tcp_syn_retries

5

실제 timeout 은 특정 이벤트마다 시도 값 * timeout + 약간의 delay  으로 계산이 되겠죠?

 

 

DB단에서 이런 리눅스의 tcp 커널 파라미터를 수정하여 성능을 높이는 일을 많이하고 있습니다만, 웹 서비스쪽은 굳이 할 필요는 없다고 생각듭니다. 어플단에서 충분히 할 수 있으니까요.

os level 단에 있는 timeout을 의존하기 보다는 db connection에 대해서 socket timeout , connect timeout을 잘 정의하는 것이 훨씬 운영면에서 편리합니다. 

Posted by 김용환 '김용환'

댓글을 달아 주세요