超時時間已到。超時時間已到,可是還沒有從池中獲取鏈接。出現這種狀況多是由於全部池鏈接均在使用,而且達到了最大池大小。

超時時間已到,可是還沒有從池中獲取鏈接。web

   出現這種狀況多是由於全部池鏈接均在使用,而且達到了最大池大小。數據庫

 Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidOperationException: 超時時間已到。超時時間已到,可是還沒有從池中獲取鏈接。緩存

 

出現這種狀況多是由於全部池鏈接均在使用,而且達到了最大池大小。 併發

  

說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以瞭解有關該錯誤以及代碼中致使錯誤的出處的詳細信息。 異常詳細信息: System.InvalidOperationException: 超時時間已到。超時時間已到,可是還沒有從池中獲取鏈接。出現這種狀況多是由於全部池鏈接均在使用,而且達到了最大池大小。 這是個老問題了!性能

 

你就查兩點:ui

1、看全部open的鏈接是否都close了。 spa

2、若是訪問量很大,加上Max Pool Size=512這一句,固然這是要以損失系統性能爲代價的! 這樣之後必定能夠解決你的問題! .net

 

解決方案一 我想緣由多是併發操做。DataReader是獨佔鏈接的,就是說你的程序可能設計上有問題。好比說最大鏈接設100,假設有100我的同時使用 DataReader正在讀取數據庫內容,那麼當第101人讀取的時候,鏈接池中的鏈接已經沒有了,就會出現上面的錯誤。DataReader是獨佔鏈接 的,每一個DataReader都要佔用一個鏈接。固然這個狀況是偶爾出現的,因此會很長時間出現一次,由於只有同時有超過鏈接池最大鏈接數量的併發操做纔會發生。並且你加大併發數量只能暫時緩解問題,若是你加大到200個併發鏈接,若是有201 人同時操做怎麼辦?你說了你使用Connection對象的Close()方法,這是不行的,由於Close()方法僅僅是關閉鏈接,但這個鏈接沒有釋放,仍是被這個對象佔用,要釋放必須使用Connection的Dispose()方法顯式釋放鏈接才能夠,不然這個對象佔用的鏈接只能等到垃圾收集的情 況下才能被釋放。這種狀況確定會出現「超時時間已到」的錯誤。 解決方法: 1 修改幾個關鍵頁面或訪問比較頻繁的數據庫訪問操做,使用DataAdapter和DataSet來獲取數據庫數據,不要使用DataReader。 設計

 

2 在訪問數據庫的頁面上使用數據緩存,若是頁面的數據不是常常更新(幾分鐘更新一次)的話,使用Cache對象能夠不用訪問數據庫而使用緩存中的內容,那麼能夠大大減小鏈接數量。 代理

 

3 修改代碼,把使用Connection對象的地方都在Close()後面加上Dispose()調用。

 

4 建議對數據庫操做進行大的修改,創建本身的數據庫操做代理類,繼承

System.IDisposable接口,強迫釋放資源,這樣就不會出現鏈接數量不夠的問題了。

 

 

解決方案二 解決方法(*):

WEB.config 裏面:在數據庫鏈接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一勞永逸。 解決方案三

 

計是鏈接(Connection)對象沒有Close。卻是沒必要Dispose,而DataReader用完後應該關閉,但不關閉也沒問題,只是不關閉的話此鏈接對象就一直不能用,只要你最終關閉了鏈接對象就不會出問題。 鏈接對象在Open後的操做都放在try塊中,後面跟一個finally塊:conn.Close();

來自:http://blog.csdn.net/sxf_zero/article/details/4241425

 

在執行 ExecuteReader 時添加參數 CommandBehavior.CloseConnection

相關文章
相關標籤/搜索