超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大
生活随笔
收集整理的這篇文章主要介紹了
超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,并且達到了最大池大
2008年11月27日 10:11
| ASP.NET c#在使用SqlDataReader讀取數據的時候,出現這個提示,在網上找了一些回答也沒有解決問題,最終還是看微軟的PetShop找到了答案。 我在一個循環中使用了SqlDataReader: ??????? using (SqlDataReader reader = SqlHelper.ExecuteReader("select * from region where fatherid=0")) ??????? { ??????????? while (reader.Read()) ??????????? { ??????????????? // 把省一級的區劃存儲到一個 Dictionary 中備用 ??????????????? Province.Add(reader["name"].ToString(), int.Parse(reader["id"].ToString())); ??????????? } ??????? } 雖然是在 using 語句中聲明的 SqlDataReader,但程序運行幾次之后還是出現了標題給出的的那個錯誤。在Sql Server 2005的 Manage Studio 中檢查進程信息時,發現只要程序運行一次,就會出現幾十個數據庫的連接沒有關閉(運行一次應該是讀取了30多個省份的信息)。運行兩三次后程序就崩潰了,進程信息達到120多個的時候就崩潰了。 于是就很奇怪,該關閉的Connection也都關閉了,Connection 和 SqlDataReader都是在using語句中聲明的,怎么會連接不關閉呢? 對比了我寫的SqlHelper類和PetShop中的SqlHelper類中的ExecuteReader方法后發現,他的ExecuteReader方法中的cmd.ExecuteReader()調用了一個參數:CommandBehavior.CloseConnection。 如下:cmd.ExecuteReader(CommandBehavior.CloseConnection) 這個參數MSDN中的解釋是:在執行該命令時,如果關閉關聯的 DataReader 對象,則關聯的 Connection 對象也將關閉。 也就是說,如果只在using語句中聲明SqlDataReader是嚴密的,那樣只是在程序結束后關閉了SqlDataReader,而和他關聯的Connection并沒有關閉(或者說釋放),因此,對于這種有關聯對象打開的情況,還必須明確的把關聯的對象也關閉,也就是CommandBehavior.CloseConnection參數提供的功能。 使用了這個參數后,運行多次該程序也沒有出現問題,進程信息中的連接數也總是保持在20多個,其中大概20個都是系統的連接。 |
總結
以上是生活随笔為你收集整理的超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机组成原理】虚拟存储器和Cache
- 下一篇: 【操作系统】核心知识归纳总结