2016-09-30 89 views

回答

1

簡答:無(默認情況下)。


爲了記錄(包括在此細節情況下,鏈接的變化),我們談論的財產maxLifetimeHikariCP

此屬性控制在池中的連接的最大生存。正在使用的連接永遠不會退休,只有在關閉後纔會被刪除。 我們強烈建議設置此值,並且應該比任何數據庫或基礎設施規定的連接時間限制少至少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:默認情況下

甲骨文不會關閉由於不活動的連接。您可以使用IDLE_TIME配置配置文件,以使Oracle關閉不活動的連接。

爲了驗證什麼是IDLE_TIME您的用戶價值,從this Q&A結合的答案:

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

請注意,其他地方可能存在其他限制(防火牆... 是的,我已經被它咬了,雖然大多數DB系統有一個保持活動機制)可能會受到干擾。所以你最好使它可配置,以防在你部署產品時發現這些問題。


在Linux上,你可以通過監控連接到數據庫TCP套接字驗證物理連接的最大壽命。我一直在我的服務器上運行下面的腳本(從視DB點是這樣的客戶主機),它需要1種說法,您的Oracle節點的ip:port,因爲它出現在netstat -tan輸出(或者,如果你的模式有幾個節點)。

#!/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" 

如果運行和在sleep時間CTRL-C停止它,它應該退出循環並清理臨時目錄,但這不是100%萬無一失

在結果沒有一個端口的值應該超過1800秒(即30分鐘),請稍等片刻。請參閱下面的示例輸出,第一個示例顯示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 

你需要運行30分鐘以上腳本看到,因爲它不知道你是怎麼測試maxLifeTime工作

+0

之前就已經存在的套接字的年齡? – user7294900

+0

啊,好問題!在我的服務器上,我有一個「Groovy Shell」(非常類似於Jenkins的[「Script Console」](https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console)),我用它來檢查連接運行時的對象。而且我可以驗證,在時間限制之後,Hikari會關閉它們並創建新的。我不在工作,所以我現在無法完全展示如何(如果需要,可以稍後嘗試),但那是想法。您還可以使用'netstat'來檢查連接到您的數據庫的打開的TCP套接字,記下端口號對,並確認沒有套接字在30分鐘內存活。 –

+1

我已經添加了一個配方來驗證在Linux上(希望你正在使用Linux ...在Mac上它也應該在最小的變化下工作) –

相關問題