我們正在使用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)的應用程序中都有此行爲。
連接池服務關閉連接時不使用它們;連接每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連接被創建時,您將看到此行爲。
在我的理解中,連接池是在客戶端(=驅動器)完成的,它是在連接上強制執行這種「硬重置」,所以理論上你總是會得到「最小池大小」的統計值,有時候它們會因爲某種原因被重置。另一位司機根本就沒有這樣做。當我們談論Oracle時,我個人懷疑你可以改變這種行爲。如果這會影響您的性能,請使用其他驅動程序。但我希望有人更有經驗這種方式:) – Koshinae
我不能再現這一點。我啓用了ODP.NET計數器,並使用您的連接字符串,我打開5個連接,對它們做一些處理並關閉並全部處理它們,然後監視HardDisconnectsPerSecond ODP.NET計數器。即使10分鐘,我也看不到硬連線。你做的事和我做的不一樣嗎? –
在OP中查看我的更新。我相信,當連接返回到池時,連接池清理會啓動,因此您必須繼續工作。 –