スレッドプールを使用して、重い処理やSQLのビットを使用しています。現在、必要なときにSQL接続を開き、クエリを実行して閉じます。これは正常に動作します。アプリケーションは問題なく実行されています。このアプリケーションでより多くの作業が行われているので、より多くのスレッドを使用しています。より多くのスレッドは、SQL接続のより多くの開閉を意味します。 SQL 2005では、これは実際にサーバーをハンマーします。私のテストサーバーは約175トランザクション/秒をしています。これらのうち約150個がmasterデータベースで実行されており、 "ValidateSQLLogin"です。スレッドセーフについての質問
私は、各スレッドが独自の接続を持つようにアプリケーションを変更し、この接続がスレッドの周りを渡されるようにします。
だから私の質問は次のとおりです。
SQL接続オブジェクトがスレッドでローカルに作成され、その後、別のクラスの静的関数に参照によって渡される場合、これは安全ではないでしょうか?
void ThreadA()
{
SqlConnection a = new SqlConnection(....);
MyStaticClass.DoStuff(ref a);
}
void ThreadB()
{
SqlConnection b = new SqlConnection(....);
MyStaticClass.DoStuff(ref b);
}
static void MyStaticClass.DoStuff(ref SqlConnection sql)
{
// Do stuff with sql
}
私の最初に考えたのは10件のスレッドがすべてそれぞれ独自の接続オブジェクトを渡し、同時に同じ静的関数を呼び出すことができますよう、それは安全ではないだろうということです。
これまでは、静的関数は独自の接続を開いて、完了した時点で閉じました。
安全でない場合は、これを処理する最善の方法は何ですか? SQL接続のオープン/クローズを最小限に抑えようとする必要があります。
おかげ
ガレス
同じ接続を共有すると、次のような質問が表示されます。接続が無効な場合は、その接続を回復する方法は? – lsalamon