2

何千ものファイルのバッチ処理のためにサーバー上で継続的に実行されているexeがあり、ファイルからのデータはすべてのファイルのデータベースに挿入され、同じ接続文字列が使用されています。パフォーマンスを向上させるために.net 4のTPLを利用しました。次のようなコードの基本的なフローは、接続プーリングについてあまり知らないため、次のアプローチで問題が発生する可能性があるため、提案してください。ありがとう。

フロー: 1. タスクの配列を作成します (50 個のファイルに対して約 50 個のタスク) 2. 各タスクを配列のタスクに追加します 3. すべてのタスクを待ち、次の 50 個のファイルに対して繰り返します

                   Task[] taskArry = new Task[50];
                    for (int i = 0; i < 50; i++)
                    {
                        taskArry[i]=(Task.Factory.StartNew(() =>                          InstanceDataObject.InserData()));

                        //var t2 = Task.Factory.StartNew(() => InsertData());
                    }

                         Task.WaitAll(taskArry);

ここで重要な点は、InsertData() メソッドで各タスクの接続オブジェクトを開始していることです。各タスクはトランザクションで実行する必要があるため、50 のタスクに対して 50 の接続が作成されます。これはパフォーマンスに影響しますか?

    internal static void InserData(string insPath, int filingId)
        {
             try
            {
               DataAccess dataAcess = new DataAccess(true);
               // insert operation here
               dataAcess.CommitTransaction();
            }
            finally
            {
                 dataAcess.Dispose();
                _dbmanager = null;

            }
}

デフォルトの接続プーリングが接続文字列に対して有効になっているため、「Server=Test;User id=user;Password=@1234;database=test」のような接続文字列を使用しています。プーリングに関連するパラメーターを設定していません。Shall i have to set the parameter regarding connection pooling?私のシナリオのために

4

1 に答える 1

0

理論的には、はい、より高速になるはずです。

実際には、実行にかかる時間によって異なりますInsertData()。十分に遅い場合、50 個のタスクのそれぞれが独自の接続を作成することになる可能性があり (プールは常に空であるため)、接続プールから利点を得ることはできません。

最善の方法は、プーリングを有効にした場合と無効にした場合の両方でコードを試し、どちらが優れているかを確認することです (実稼働環境をできるだけ厳密にシミュレートしてみてください。クライアントとサーバーのネットワーク遅延とパフォーマンスは、データに大きな違いをもたらします)。 .

ADO.NET ( http://msdn.microsoft.com/en-us/library/ms254503.aspx ) に組み込まれているパフォーマンス カウンターを使用して、プールが役に立っているかどうかを評価することもできます。プーリングをオンにしてコードを実行し、NumberOfPooledConnectionsカウンターを確認してください。これが 50 未満の場合は、接続を正常に再利用しています。

于 2013-05-09T00:19:49.647 に答える