バックグラウンドワーカー以上のものを使用するマルチスレッド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);
}
次の点に注意してください。 - 手順を実行するバックグラウンド ワーカーは、終了時に再度実行されます。- 何百ものデータベースが使用されているため、データベースのロックが多すぎます。-データベースは、ロックなしで常に応答することが非常に重要です。-接続プーリングは、接続を常にスリープ状態または中断状態に保ちます。-プロシージャをキューに追加する比率は、それらを実行する比率よりも速くなりません。
私の質問は
この方法を使用する方が良いですか、それとも多くの接続を使用してもデータベースには影響しません。