簡體   English   中英

超時時間已到。 獲得連接之前經過的超時時間第一個連接

[英]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.

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