0

バックグラウンドワーカー以上のものを使用するマルチスレッドWindowsアプリケーションがあります。すべてのバックグラウンド ワーカーは何らかのコードを使用して同じ SQL Server データベースを更新し、終了すると再び実行されます。すべてのバックグラウンド ワーカーが単一の接続を使用していることに気付きました。カスタム クラスの ConcurrentQueue を作成して、すべてのストアド プロシージャを追加し、単一の backgorundworker から実行して、多くの接続を使用するとデータベースが非常に遅くなるため、1 つの接続のみを使用します。これが私のコードです
これはストアドプロシージャクラスです

    string _procName;
    Dictionary<string, object> _parameters;
    public string ProcName
    {
        get { return _procName; }
        set { _procName = value; }
    }


    public Dictionary<string, object> Parameters
    {
        get { return _parameters; }
        set { _parameters = value; }
    }

    public PSCProc(string procName, Dictionary<string, object> parameters)
    {
        _procName = procName;
        _parameters = parameters;
    }  

ストアドプロシージャを実行するために使用されるメソッドは次のとおりです

 public static void execProc(string procName, Dictionary<string, object> parameters)
    {

        using (var conn = new SqlConnection(Test.Properties.Settings.Default.testConnection))
        using (var command = new SqlCommand(procName, conn)
        {
            CommandType = CommandType.StoredProcedure
        })
        {
            foreach (var item in parameters)
            {
                command.Parameters.AddWithValue(item.Key, item.Value);
            }
            conn.Open();
            command.ExecuteNonQuery();
            conn.Close();
            Form1.updated++;
        }
    }

これがアイテムをキューに追加する方法です

Dictionary<string, object> parameters = new Dictionary<string, object>();
            int x = 1;
            string address = "cairo";
            parameters.Add("@id", x);
            parameters.Add("@address", address);
            PSCProc proc1 = new PSCProc("updateAddress", parameters);
            pscQueue.Enqueue(proc1);

そして、これがバックグラウンドワーカーを実行して手順を実行する方法です

 PSCProc proc;
            if (pscQueue.TryDequeue(out proc))
            {
                helper.execProc(proc.ProcName, proc.Parameters);
            }

次の点に注意してください。 - 手順を実行するバックグラウンド ワーカーは、終了時に再度実行されます。- 何百ものデータベースが使用されているため、データベースのロックが多すぎます。-データベースは、ロックなしで常に応答することが非常に重要です。-接続プーリングは、接続を常にスリープ状態または中断状態に保ちます。-プロシージャをキューに追加する比率は、それらを実行する比率よりも速くなりません。

私の質問は

この方法を使用する方が良いですか、それとも多くの接続を使用してもデータベースには影響しません。

4

2 に答える 2

0

実際の量によっては、接続の量によって SQL Server の速度が低下する可能性があります。

アプリケーションが接続プーリングを正しく使用しているかどうかを確認することで、スリム化する 1 つの方法が考えられます。正しい方法については、この MSDN の記事を参照してください。多くは、接続文字列と接続が残っている状態に依存します (開いているトランザクションがある場合、別の資格情報をプールすることはできません)。

もう 1 つの方法は、プロシージャの実行を中央サービスに移動し、そのサービスにデータベースの要求/応答をキャッシュさせることです。

最後に、プロシージャ/クエリ自体を確認します。多くのロックが行われているとあなたは言います。その理由を調べてみてください。テーブルの最後に挿入ホットスポットを作成しましたか? インデックスは、ホットスポットの削除に役立つ場合があります。(挿入) トリガーが邪魔をしている可能性があります。詳細については、この投稿を参照してください

于 2013-09-18T06:23:58.127 に答える