簡體   English   中英

連接池行為 ODP.NET

[英]Connection Pool Behavior ODP.NET

我正在嘗試使用 ODP.NET 計算連接池的行為。 我了解基礎知識,但我不明白發生了什么。 我有一個應用程序,每 X 秒啟動一次線程,該線程連接並對數據庫執行大量搜索,然后斷開連接,一切都按照您的預期進行處理和斷開連接。 由於連接字符串中的默認值和 X 設置為較高的數字以確保搜索在下一次搜索發生之前完成,我得到一個異常,不是在連接上,正如我所期望的那樣,而是在 OracleDataAdapter.Fill() 上。 我得到以下異常:

'ORA-00604: error occurred at recursive SQL level 1 ORA-01000: maximum open cursors exceeded'

第 9 次連接后。 每次。 然后,應用程序將無限期運行而不會出現其他錯誤。 它肯定與連接池有關。 如果我關閉池,它可以正常工作。 如果我將 Min Pool Size 調高,則錯誤需要更長的時間,但它最終會發生。

我對連接池的期望是等待調用連接以獲得新連接,而不是 Fill 在已連接的適配器上失敗(盡管我知道連接 object 正在使用池,所以也許這不是正在發生的事情)。 無論如何,這是奇怪的行為。

您的錯誤與最大連接數無關,而是與最大游標數有關。

cursor 實際上是指向數據庫服務器中 memory 地址的指針,它讓服務器查找 cursor 正在執行的查詢以及 cursor 的當前 state。

您的代碼正在連接然后打開游標,但無論出於何種原因,它都沒有關閉游標。 當您關閉連接時,它會自動關閉所有游標; 但是,當您將連接返回到連接池時,它會保持連接打開,以便可以重復使用(並且因為它不會關閉連接,所以不會自動關閉所有游標)。

最佳做法是確保當您打開 cursor 時,它會在您完成讀取時關閉,並且如果在執行 cursor 期間出現錯誤,這會阻止正常的執行路徑,那么 cursor 會在以下時間關閉你抓住了例外。

您需要調試代碼並確保關閉所有打開的游標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM