2016-01-22 161 views
5

我們正在使用Oracle的最新官方ODP.NET託管(發佈:2015-10-14 |版本:12.1.2400)到Oracle 12數據庫(非RAC)配置,並且我們無法保持數據庫連接的活動時間超過3分鐘通常爲<。ODP.NET託管連接池每隔3分鐘關閉/打開

我們的連接字符串指定:

MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1; 

,我們也試圖

CONNECTION LIFETIME=90000;MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1; 

當我們在服務器上使用性​​能監視器,看計數器HardConnects/HardDisconnects我們本身連接池關閉並且每3分鐘重新打開5個連接,這不是我們所期望的。

我們在使用EF6 for DataAccess的Web應用程序和沒有ORM(只是普通的舊SQL)的應用程序中都有此行爲。

按照Oracle Documentation

連接池服務關閉連接時不使用它們;連接每3分鐘關閉一次。 ConnectionString屬性的Decr Pool Size屬性爲每3分鐘可關閉的最大連接數提供連接池服務。

對我來說 - 只要連接在壽命限制內,連接池中的連接的MIN POOL SIZE的長度應該大於3分鐘。

我們有另一個使用Devart的Oracle驅動程序的應用程序,這個驅動程序收集了長時間保持活動狀態的連接。

有沒有其他人選擇了ODP.NET託管驅動程序中ConnectionPool的這種「不當行爲」並找到了解決方案? 或者這可能是ODP.NET託管的ConnectionPool中的錯誤?

UPDATE 2016年1月27日:

我添加了一個演示應用程序在我的github帳戶來說明這個問題:

https://github.com/jonnybee/OraConnTest

這只是一個小的WinForms應用程序在您添加連接字符串然後單擊該按鈕以啓動一個每3秒運行一次「SELECT」OK'FROM DUAL「的後臺工作程序。我的連接字符串包含:POOLING = True; MAX POOL SIZE = 10; DECR POOL SIZE = 1; CONNECTION LIFETIME = 86400; INCR POOL SIZE = 1; MIN POOL SIZE = 5 +您必須添加USER ID,PASSWORD和數據源。

每隔3分鐘您會看到5個現有連接關閉,並創建5個新連接(MIN POOL SIZE設置)。

運行該SQL看到實際的連接:其中程序LIKE '%OraWinApp%' 爲了通過LOGON_TIME遞減

當程序 選擇SID,LOGON_TIME,prev_exec_start,wait_time_micro/1000 從V $會議 並且perfmon正在運行,當舊連接關閉並且新的login_time連接被創建時,您將看到此行爲。

+0

在我的理解中,連接池是在客戶端(=驅動器)完成的,它是在連接上強制執行這種「硬重置」,所以理論上你總是會得到「最小池大小」的統計值,有時候它們會因爲某種原因被重置。另一位司機根本就沒有這樣做。當我們談論Oracle時,我個人懷疑你可以改變這種行爲。如果這會影響您的性能,請使用其他驅動程序。但我希望有人更有經驗這種方式:) – Koshinae

+0

我不能再現這一點。我啓用了ODP.NET計數器,並使用您的連接字符串,我打開5個連接,對它們做一些處理並關閉並全部處理它們,然後監視HardDisconnectsPerSecond ODP.NET計數器。即使10分鐘,我也看不到硬連線。你做的事和我做的不一樣嗎? –

+0

在OP中查看我的更新。我相信,當連接返回到池時,連接池清理會啓動,因此您必須繼續工作。 –

回答

0

我同意你的評估應該如何工作,但在ODP.net連接池有點奇怪。這裏的關鍵是隻有當應用程序關閉一個連接時,纔會遵守連接生命週期,而連接池的大小似乎有它自己的線程。我不知道他們爲什麼這麼做 - 只有在返回池時創建一個senario,您可以從池中拉出一個死鏈接(由防火牆超時終止)進行驗證。

我實際上設置了min pool size = 0。這可以確保應用程序閒置時池爲空。我幾乎可以保證,除非您的網絡非常慢或者已經有一個已經重載的Oracle實例,否則您將不會注意到其中的差異。連接池很重要,但連接通常可以在幾毫秒內建立。

扔我在這裏下車的唯一的事情是,所有5個連接被關閉 - DECR池大小默認爲1

+0

查看我的更新和示例應用程序。我使用MIN POOL SIZE = 0和CONNNECTION LIFETIME = 86400(= 24 Hours)運行示例應用程序,即使使用這些設置並每3秒運行一次SQL,連接池也會每隔3分鐘關閉一次連接。 從我所看到的ODP NET不尊重DECR POOL SIZE和CONNECTION LIFETIME設置,只允許連接在活動執行清理時才處於活動狀態 –