2014-05-12 72 views
1

我有一個WebAPI服務使用ODP.NET連接到多個Oracle數據庫。通常,網絡服務會每秒打幾次,永遠不會長時間處於不活動狀態。然而,在我們的測試網站中,我們沒有使用它2-3天。今天早上,我們遇到了服務,並從ODP.NET中獲得了「連接請求超時」異常,這表明連接池沒有可用的連接。使用後我們正在關閉連接。該服務在這段時間之前工作正常,但今天第一個查詢得到超時異常。我們在IIS中的應用程序池配置爲永不重置。ODP.NET連接池問題 - 數據庫關閉後的容錯問題

我的問題是,什麼會導致連接池在一段時間不活動後填充不良連接,而這些連接在通常的3分鐘週期內沒有清理?它只發生在我們三個數據庫中的兩個中,並且爲所有數據庫都設置了Validate Connection = true。

EDIT 所以談話的DBA後,存在之間的連接/會話被手動地或通過超時和數據庫服務器切斷所述TCP連接殺死一些不同。在這種情況下,TCP連接作爲常規備份的一部分被切斷(爲什麼對此不重要)。我想這發生在整個數據庫服務器一次下線時。問題的依據仍然適用我認爲雖然:爲什麼ODP.NET無法清理中斷連接超時?有一個表示「Stasis」連接的性能計數器,那些連接是否可以卡在該狀態?我會認爲它應該能夠看到連接不再處於活動狀態(Validate Connection = True),將其殺死並且不會將其返回到池中。

當然,這個問題可以通過重置應用程序池來解決數據庫關閉的所有問題。我仍然希望將ODP.NET連接池配置爲更容錯。

+0

您使用ODP.NET託管或非託管驅動程序? – metalheart

+0

我正在使用非託管驅動程序。 – ChoptimusPrime

回答

1

我遇到了同樣的問題,唯一的解決方案是使用連接生命期連接字符串參數與驗證連接。

在我的特殊情況下,連接超時設置在服務器上,連接池中的連接將超時,但不會被淹沒在池中,導致錯誤。

設置連接生存期和驗證連接參數已解決該問題。

確保您選擇的連接使用期限值小於服務器連接不活動超時值。

+0

有趣的是,在這種情況下池的大小是最大的,還是應用程序會在甲骨文殺死它們之後重複使用這些連接,所以不要嘗試增加池?在後一種情況下,您將如何移除池中留下的最小數量的連接? – ChoptimusPrime

+0

我知道清理過期連接池的唯一方法是設置連接生命週期。 11g和ODP.Net庫之間有一些奇怪的相互作用,我沒有時間進一步研究。我很想知道爲什麼Oracle不使用自己的資源限制來正確處理池中的死連接。 –

+0

好的,謝謝。我認爲你的建議與在這裏讓游泳池縮小到0的建議結合起來應該可以做到。我將在一週內執行此操作並進行監視。 http://stackoverflow.com/questions/12662686/is-connection-pooling-a-must-have-in-odp-net – ChoptimusPrime

0

其他事情正在發生。最小池大小和一些其他設置有助於在連接從諸如DBA配置的空閒超時和防火牆tcp空閒超時之類的事件中切斷時,在創建新連接時發生「連接請求超時」。

這可能是一個簡單的網絡問題。有可能會干擾服務器的DNS解析。另一種情況是tnsnames中沒有完全限定條目。我已經有幾次被後者咬了一口。

另一個問題是您已經認識的問題 - 完整池。

仔細檢查您沒有連接泄漏的地方。缺少.Close是一回事,但如果您沒有使用'using'語句,則需要try/finally,因爲可能會在.Close之前拋出未處理的異常。

我會使用性能監視器來監視一些連接統計信息的開始 - NumberOfPooledConnections,NumberOfActiveConnections等:

enter image description here

+0

我修改了我的原始答案 - 我意識到除池以外的其他原因導致連接超時錯誤。 –

+0

感謝您的回覆。我會嘗試設置性能計數器。 – ChoptimusPrime