2013-02-26 85 views
2

我有這個問題。我在這個問題上搜索了很多站點,但他們都建議關閉所有的連接,或者只是在連接和dataReader中使用「using」。但!我的問題在於我無法打開第一個連接!我在連接點附近設置了一個斷點,並看到沒有其他連接,所以有第一個連接。這個問題,當我重拍類從靜態到辛格爾頓其開放連接rized,這裏是代碼:超時已過期。獲取連接之前超時時間已過第一次連接

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; 

} 

,這裏是一個經理構造

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。任何人有想法?

UPDATE:

,如果我關掉池 - 我有"System.StackOverflowException" in System.Data.dll在同一直線上。

+0

就我個人而言,我會說任何涉及單身固定連接的東西本質上都是一個壞主意。但是:有多少其他地方的負載管理?特別是任何能夠激發少數經理人的事情都會產生鎖定聯繫的副作用,而他們並不希望他們關門。 – 2013-02-26 07:40:31

+0

問題出在第一次連接,所以Manager()在一個。我試圖用lock()來創建Singleton,但它沒有幫助。 – user1947702 2013-02-26 07:47:51

+1

並且這是*整個應用程序*中唯一的連接/管理器實例?信息是否以「從游泳池」結束? – 2013-02-26 07:48:44

回答

1

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()方法關閉並釋放連接:

​​

這將然後通過using使用:

private Storage() 
{ 
    using(Manager man = new Manager()) 
    { 
     products = man.LoadProducts(); 
     components = man.LoadComponents(); 
     man.LoadProductComponents(); 
    } 
} 

我擔心的是你的經理是一個更廣泛的問題,只是一個簡單的例子:後自己不清理連接。當Manager是靜態的時候,這可能是不可見的,但是當切換到Manager實例時,很容易旋轉多個Manager對象。每一個連接到GC的連接。

+0

我說過,我可以看到,當異常情況發生時,連接的狀態是關閉的。那麼,您的Dispose()如何幫助我?這是第一個連接,我第一次連接不上。 – user1947702 2013-02-26 08:31:28

+0

@ user1947702如何把這個......特定的錯誤信息不會發生在第一個連接上。它發生在你沒有清理連接而使泳池飽和時。並且您發佈了不清理連接的代碼。我非常懷疑還有其他連接正在創建,也許在代碼中的其他地方,那就是讓遊戲池飽和。 – 2013-02-26 11:52:03

+0

謝謝,我確定了我的錯誤,問題在於循環 – user1947702 2013-02-27 15:42:37

相關問題