6

これは、いくつかのデータをいくつかのテーブルに保存する私の既存のコードです

using (SqlConnection conn = new SqlConnection("myConnString"))
{
   DoWork1(conn);
   DoWork2(conc);
   DoWork3(conn);
}

コードを高速化するために、.net TPLサポートを取得しようとし、以下のようにコードを再ハングアップしました

using (SqlConnection conn = new SqlConnection("myConnString"))
{
   ParallelOptions pw = new ParallelOptions();
   pw.MaxDegreeOfParallelism = Environment.ProcessorCount;

   Parallel.Invoke(pw,()=> DoWork1(conn),()=> DoWork2(conc),()=> DoWork3(conn));
} 

しかし、これにより、データアクセス層のExecuteNonQuery()メソッドから内部接続の致命的なエラー例外がスローされます。並列アプローチは間違っていますか?

4

2 に答える 2

9

まあ、MARSを使用して動作させることができる可能性のある方法はいくつかありますが、別のアプローチを提案します。(複数の同時操作が可能であっても、MARSが複数のスレッド間で同じ接続の使用をサポートしているかどうかはわかりません。)

すべての並列タスクで1つの接続を再利用しようとする代わりに、各タスクがそれ自体の接続を開いて(そして閉じて)、接続プールにその効率面を処理させます。これは、並列処理を使用しているかどうかに関係なく、.NETの一般的なベストプラクティスです。接続を開き、作業を行い、接続を閉じます。

于 2012-04-20T06:04:38.013 に答える
0

コメントする評判はありませんが、答えられるようです。それは少し奇妙ですとにかく私のコメントは、一時テーブルは接続ごとであるため、新しい接続を開くと、他のタスクによって作成された一時テーブルを表示できないことを意味します。

グローバル一時テーブルが答えかもしれませんが、a)単一のグローバル一時テーブルを使用し、いくつかのキーを使用してデータを分割する必要がありますb)動的SQLを意味する一意の名前のテーブルを使用する

本当に混乱のすべて

于 2018-08-24T16:40:16.243 に答える