2

この問題があります。この問題について多くのサイトをグーグル検索しましたが、すべてのサイトで、すべての接続を閉じるか、接続と dataReader で「使用」を使用するようにアドバイスされています。しかし!私の問題は、最初の接続を開くことができないということです! 接続の近くにブレークポイントを設定すると、他の接続がないことがわかりました。最初の接続があります。この問題は、静的からシングルトンへの接続を開くクラスを作り直したときに発生しました。コードは次のとおりです。

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と、同じ行になります。

4

1 に答える 1

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を実装しIDisposableDispose()メソッドを閉じて接続を解放することを期待します。

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();
    }
}

私の懸念は、あなたのマネージャーは、より広範な問題の 1 つの例に過ぎないということです。が静的な場合Manager、これはおそらく非常に目に見えませんが、インスタンスに切り替えると、複数のオブジェクトManagerを簡単にスピンアップできます。Managerこれはそれぞれ、GC まで接続を結び付けます。

于 2013-02-26T08:21:20.617 に答える