[英]Will connection leak might Cause Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool?
[英]Timeout expired. The timeout period elapsed prior to obtaining a connection First connection
我有這個問題。 我已經在很多網站上搜索了此問題,但所有這些網站都建議關閉所有連接,或者僅對連接和dataReader使用“使用”。 但! 我的問題在於無法打開第一個連接! 我在連接附近設置了一個斷點,然后看到沒有其他連接,因此有第一個連接。 當我重新創建從靜態到Singleton的開放連接的類時,此問題出現了,這是代碼:
public class Storage
{
private static Storage instance;
public static Storage Instance
{
get
{
if (instance == null)
{
instance = new Storage();
}
return instance;
}
}
private Storage()
{
Manager man = new Manager();
products = man.LoadProducts();
components = man.LoadComponents();
man.LoadProductComponents();
}
public Dictionary<int, Product> Products
{
get { return products; }
set { products = value; }
}
public Dictionary<int, Component> Components
{
get { return components; }
set { components = value; }
}
private Dictionary<int, Product> products;
private Dictionary<int, Component> components;
}
這是一個Manager構造函數
public Manager()
{
connection = new SqlConnection(@"Persist Security Info=False;User ID=user;Password=pass;Initial Catalog=Products;Server=(local)");
if (connection.State != ConnectionState.Open) connection.Open();
}
引發異常時,連接為Closed
。 有人有想法嗎?
更新:
如果我關閉池-在同一行的"System.StackOverflowException" in System.Data.dll
中有"System.StackOverflowException" in System.Data.dll
。
您的Manager
類創建並打開一個連接:
public Manager()
{
connection = new SqlConnection(@"Persist Security Info=False;User ID=user;Password=pass;Initial Catalog=Products;Server=(local)");
if (connection.State != ConnectionState.Open) connection.Open();
}
但是,如果我們看看您的使用方式,那么很明顯沒有任何東西可以關閉此連接:
private Storage()
{
Manager man = new Manager();
products = man.LoadProducts();
components = man.LoadComponents();
man.LoadProductComponents();
}
我希望Manager
實現IDisposable
,並關閉Dispose()
方法並釋放連接:
class Manager : IDisposable
{
...
public void Dispose()
{
if(connection != null) connection.Dispose();
connection = null;
}
}
然后可以通過using
:
private Storage()
{
using(Manager man = new Manager())
{
products = man.LoadProducts();
components = man.LoadComponents();
man.LoadProductComponents();
}
}
我擔心的是,您的經理只是一個更廣泛的問題的一個例子:您自己之后不清理連接。 當Manager
是靜態的時,這可能是非常不可見的,但是當切換到Manager
實例時,很容易拆分多個Manager
對象。 每個連接都會連接直到GC。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.