2

Linq to SQL に混乱があります。データ コンテキスト クラスが次の例外を何度か与える実際の理由を探しています。

「このコマンドに関連付けられたオープン データ リーダーが既に存在します。これを最初に閉じる必要があります。

特にマルチタスク環境では、ほとんどの人が、データ コンテキストがスレッド セーフではないという理由であると言っています。

ベストアンサーは以下のスレッドを参照してください

複数のスレッドにわたる Linq-to-SQL データ コンテキスト

しかし、私の場合、シングルトンパターンで実装されている別のクラス呼び出し「A」を使用しています。このクラスの目的は、シングルトン方式でデータコンテキストオブジェクトを提供することです。このクラス「A」のインスタンスを派生のグローバルインスタンスとして維持していますクラスを作成し、特定のインスタンスを使用して Datacontex を呼び出します。

私の質問は、

メソッド呼び出しにより、制御不能なメモリの増加が発生しますか? 私の理解に基づいて、シングルトンは1つのインスタンスを静的オブジェクトとして維持します。私の仮定が間違っている場合は、適切な説明をお願いします。

ノート:

いずれにしても、私のメソッド呼び出しでも同じ例外がスローされます。したがって、このシナリオでも同じ問題が発生すると確信しています。

4

2 に答える 2

9

あなたのアプローチは一般的に問題を引き起こします。ADataContextはシングルトンになることを意図していません。やらないでください。

Aがシングルトンの場合でも、内でa を変数として持つのではなく、DataContext内の適切なメソッド内で new を作成します。(そもそも本当にシングルトンであるべきかどうかを検討することもできます。)ADataContextAA

于 2013-06-20T19:11:05.260 に答える
2

Linq Datacontext にもシングルトン パターンが最適だと感じたので、実際にここに来ました。しかし、あなたの問題を見た後、それはそうではないからです。

Singleton Linq DataContext の記述方法の例を次に示します。

class DataAccess
{
    private static DataContext db = null;

    private DataAccess()
    {
    }

    public static DataContext GetInstance()
    {
        return db ?? (db = new DataContext());
    }
}

シングルトン パターンでは、DataContext インスタンスを静的に設定します。さて、マルチスレッド環境では、静的オブジェクトは、あなたが見ているエラーのような衝突を引き起こします. これらのエラーが発生するのは幸運です。複数のスレッドを使用すると、別のスレッドから変更を送信してから、元のスレッドを送信して大きな混乱を引き起こす可能性があります。

非静的実装に固執します。本当に残念ですが、ここでもそのパターンを使用したかったのです。

于 2013-08-26T21:22:23.010 に答える