짧은 답 : 없음 (기본값). 기록을 위해
내 경험에 비추어 볼 때 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:port
은 netstat -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 작동 테스트 않았다
전에 존재 소켓의 나이를 모르기 때문에 당신은 그것을 볼 수있는 30 분 이상 스크립트를 실행해야합니다? – user7294900
아, 좋은 질문입니다! 내 서버에는 연결을 검사하는 데 사용 된 Jenkins의 [Script Console] (https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console)과 매우 유사한 "Groovy Shell"이 있습니다. 런타임에 객체. 그리고 시간 제한이 지나면 히카리가 그들을 닫고 신선한 것을 만들 수 있다는 것을 확인할 수있었습니다. 나는 지금 일하고 있지 않으므로 정확히 어떻게 지금 보여줄 수 없습니까 (필요할 경우 나중에 시도 할 수 있음). 그러나 그것은 생각이었습니다. 또한'netstat'을 사용하여 DB에 연결된 열린 TCP 소켓을 확인하고 포트 번호 쌍을 적어두고 30 분 동안 소켓이 남아 있지 않은지 확인하십시오. –
나는 리눅스에서 그것을 확인하기위한 레서피를 추가했다. (잘하면 리눅스를 사용하고있다. 맥에서는 최소한의 변화 만 있으면된다.) –