처 : http://blog.naver.com/tkpolee?Redirect=Log&logNo=80018362072 

 

 

DB를 사용하다 보면 batch작업이나 long query를 사용하는 경우가 있는데, 이럴때 장시간 반응이 없어서 pc의 전원을 강제로 꺼버리거나 작업도중 정전이 발생할 수도 있는데, 이럴 경우 세션은 비정상적으로 종료가 되어 세션이 정리가 되지 않고 남아 있게된다.

 

만약 이러한 세션이 다수가 되면 정상적인 다른 세션들에게 자원배분(메모리등)이 정상적으로 되지 않거나 프로세스 초과 에러 메세지가 발생할 수 있다. 이렇게 실제 사용하지 않은 세션들을

DEAD SESSION(죽은 세션)이라고 하는데 이들을 정리할 필요가 있다.

 

KeepAlive 란 Idle TCP/IP Connection 의 Time out 기능을 말한다.

TCP/IP 기반으로 remote 로 연결된 상태에서 클라이언트의 갑작스런 리부팅이나 스위치 Off 의 경우 해당 연결을 서버에서 Closing 하지 못하게 된다.


이것은 TCP/IP의 제한인 것이지 오라클의 문제는 아니다.
이 때 KeepAlive가 정확하게 configure되어 있다면 좀 더 빨리 Dead connection을 발견하고 빨리 Closing할 것이다.
TCP/IP 에 관련된 것이므로 KeepAlive를 각 플랫폼 별로 지정하는 방법이 모두 틀리다.

예를들면 유저가 PC 에서 Unix Oracle Server로 연결 후 실수로 다음 쿼리 문을 실행했다.

 

SQL> select * from largetable, greatetable, verybigtable;

 

적게는 수십분, 많게는 몇시간이 걸릴 작업이라면 유저는 쿼리를 인터럽트하기 보다 reset 버튼을 누르게 될 것이다. 이때 클라이언트 프로세스는 없어졌지만 백그라운드 서버 프로세스는 계속

running 중일것이다.
이런 현상은 수시로 일어날 수 있다. 또한 당연한 것이다.

유저가 사용을 잘못하는 것이기 때문이다.

하지만 SQL*NET 2.1 이상에서 Dead-Connection-Detection 이라 불리는 기능을 지원한다.

이것은 곧 KeepAlive 를 지정할 수 있는 기능이다.
반드시 서버 사이드의 $ORACLE_HOME/network/admin/sqlnet.ora 파일에 다음의 파라미터를

지정해야 한다. 클라이언트에는 지정해봐야 전혀 소용이 없다.

 

sqlnet.expire_time = 3   (단위 : 분)

 

Netware를 제외한 모든 Platform, Protocol에서 지원이 된다.

# Windows NT 에서 KeepAlive 를 지정하는 방법(타 플랫폼은 제외)

Regedt32 를 실행한다.

레지스트리에서

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

까지 이동한다.
여기서 키 추가가 아닌 값 추가를 한다.

파라미터는  KeepAliveTime (REG_DWORD) 로 입력한다.

값은 Decimal  -> 180000 (for example = 3 minutes) 으로 지정한다.

Posted by 나른한스누피