2016-09-30 4 views
2

에 대한 maxLifetime을 설정하기 위해 고려되어야한다 무엇 데이터베이스,HikariCP : 레벨 제한 시간이 HikariCP에 대한 문서에서 오라클 11g

우리는 강력하게이 값을 설정하는 것이 좋습니다, 그것은 최소 30 초 이하로해야한다고 언급 데이터베이스 수준 연결 시간 초과보다

Oracle11.2 데이터베이스에서 고려해야 할 데이터베이스 수준 연결 시간 초과 란 무엇입니까? 그리고 어떻게 이러한 타임 아웃 (실행 쿼리)을 찾을 수 있습니까?

답변

1

짧은 답 : 없음 (기본값). 기록을 위해


은 (여기에 세부 사항의 경우 링크 변경에 포함), 우리는 HikariCP의 재산 maxLifetime 대해 얘기 :

이 속성은 수영장에서 연결의 최대 수명을 제어 . 사용중 접속은 결코 종료되지 않고, 접속이 종료되었을 때에 만 삭제됩니다. 이 값은 데이터베이스 또는 인프라에 지정된 연결 시간 제한보다 최소 30 초 이상 짧아야합니다. 값이 0이면 최대 수명 (무한 수명)이 없음을 나타내며 당연히 idleTimeout 설정을 따릅니다. 기본값 : 1800000 (30 분)

내 경험에 비추어 볼 때 HikariCP가하는 ​​것은 좋은 일입니다. 지금까지 이라고 말할 수있는 한 Oracle은 연결 (JDBC 드라이버 측 (1) 또는 서버 측 (2) 모두)에 최대 수명을 적용하지 않습니다. 따라서이 점에서 " 인프라에 의해 부과 된 연결 시간 제한"은 + 무한대입니다. 이것은 우리에게 오래 걸리는 연결 문제를 관찰했기 때문에 문제였습니다. 또한 어떤 값이 의미 나는 그것이 위의 같은 것들을 처리하기 위해 풀 층에 계산하기 때문에 연결 층은 이것에 대해 아무것도하지 않는 가정 기본 :

포함 "30 초 이상 이하" . (지금은 사용되지 않음) implicit connection pool을 사용할 수 없었습니다. UCP (대체품)을 사용할지 여부는 알 수 없지만 HikariCP를 사용하는 경우에는 사용하지 않습니다.

이제는 특정 연결에 대해 30 분 (일반적으로 다양한 용도로 여러 번 사용) 후에 HikariCP가이를 닫고 새 것을 만듭니다. 이는 아주 적은 비용으로 오래 지속되는 연결로 문제를 해결했습니다. 우리는이 기본값에 만족하지만, 경우에 따라 설정을 변경할 수 있습니다 (아래 2 참조).

(1) OracleDataSource 것을 제어 할 수있는 configuration point (속성 또는 시스템 등록 정보)를 제공하지 않습니다, 나는 무한 수명을 관찰했다.

(2) 서버 쪽 한도는 profile parameter IDLE_TIME을 참조하십시오. this answer 인용 : 기본적으로

오라클은 비 활동으로 인해 연결을 종료하지 않습니다. Oracle이 비활성 연결을 닫게하려면 IDLE_TIME으로 프로파일을 구성 할 수 있습니다.

select p.limit 
from dba_profiles p, dba_users u 
where p.resource_name = 'IDLE_TIME' and p.profile = u.profile and u.username = '...' 
; 

기본값은 UNLIMITED입니다 :

this Q&A에서 답변을 결합하여 사용자에 대한 IDLE_TIME의 값이 무엇인지 확인합니다.

다른 제한 사항 (방화벽 ... 예, 대부분의 DB 시스템에 keep-alive 메커니즘이 있습니다.)이 영향을받을 수 있습니다. 따라서 제품을 배포 할 때 이러한 문제가 발견되는 경우에는 구성 가능으로 설정하는 것이 좋습니다.


리눅스에, 당신은 데이터베이스에 연결된 TCP 소켓을 모니터링하여 물리적 연결의 최대 수명을 확인할 수 있습니다. 아래 코드는 클라이언트 인 클라이언트 인 DB 관점에서 아래 스크립트를 실행했습니다. 오라클 노드의 ip:portnetstat -tan의 출력 (또는 여러 개의 노드가 있음). 당신이 그것을 실행하고 sleep 시간 동안 CTRL-C로를 중지하면

#!/bin/bash 
target="$1" 
dir=$(mktemp -d) 
while sleep 10 
do 
    echo "------------ "$(date) 
    now=$(date +%s) 
    netstat -tan | grep " $target " | awk '{print $4}' | cut -f2 -d: | while read port 
    do 
     file="p_$port" 
     [ ! -e $file ] && touch $file 
     ftime=$(stat -c %Z "$file") 
     echo -e "$port :\t "$((now - ftime)) 
    done 
done 
\rm "$dir"/p_* 
\rmdir "$dir" 

, 그것은 루프를 종료하고 임시 디렉토리를 정리하지만,이 결과에 절대 안전한 100 %

되지 않습니다한다 포트 중 어느 것도 1800 초를 초과하는 값을 나타내지 않아야합니다. (즉, 30 분), 1 분을주고받습니다. 아래 예제 출력을 보자. 첫 번째 샘플은 1800 초 이상의 소켓 2 개를 보여 주며, 10 초 후에 사라진다.

------------ Thu Jul 6 16:09:00 CEST 2017 
49806 : 1197 
49701 : 1569 
49772 : 1348 
49782 : 1317 
49897 : 835 
49731 : 1448 
49620 : 1830 
49700 : 1569 
49986 : 523 
49722 : 1498 
49715 : 1509 
49711 : 1539 
49629 : 1820 
49732 : 1448 
50026 : 332 
49849 : 1036 
49858 : 1016 
------------ Thu Jul 6 16:09:10 CEST 2017 
49806 : 1207 
49701 : 1579 
49772 : 1358 
49782 : 1327 
49897 : 845 
49731 : 1458 
49700 : 1579 
49986 : 533 
49722 : 1508 
49715 : 1519 
49711 : 1549 
49732 : 1458 
50026 : 342 
49849 : 1046 
49858 : 1026 

이 어떻게 maxLifeTime 작동 테스트 않았다

+0

전에 존재 소켓의 나이를 모르기 때문에 당신은 그것을 볼 수있는 30 분 이상 스크립트를 실행해야합니다? – user7294900

+0

아, 좋은 질문입니다! 내 서버에는 연결을 검사하는 데 사용 된 Jenkins의 [Script Console] (https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console)과 매우 유사한 "Groovy Shell"이 있습니다. 런타임에 객체. 그리고 시간 제한이 지나면 히카리가 그들을 닫고 신선한 것을 만들 수 있다는 것을 확인할 수있었습니다. 나는 지금 일하고 있지 않으므로 정확히 어떻게 지금 보여줄 수 없습니까 (필요할 경우 나중에 시도 할 수 있음). 그러나 그것은 생각이었습니다. 또한'netstat'을 사용하여 DB에 연결된 열린 TCP 소켓을 확인하고 포트 번호 쌍을 적어두고 30 분 동안 소켓이 남아 있지 않은지 확인하십시오. –

+1

나는 리눅스에서 그것을 확인하기위한 레서피를 추가했다. (잘하면 리눅스를 사용하고있다. 맥에서는 최소한의 변화 만 있으면된다.) –