2017-05-09 11 views
5

Dapperを使用してSQL Serverにデータを書き込むためのコードを記述しました。他の作業を続ける前にこの書き込みが完了するのを待つ必要はないので、Task.Run()を使用して非同期にする必要があります。C#、Dapper、SQL Server、および接続プーリング

私は私のシステムの残りの部分でこれを呼び出すための文を(使用)があります。

using (IDataAccess ida = new DAL()) 
     { 
      ida.WriteMessageToDB(id, routingKey, msgBody); 
     } 

私のDALは、自動的に使用した文が実行されたときにdbConnection.Stateをチェックし、それはだ場合は、簡単な修正を試みます閉まっている。これは、非同期/ TPL選択呼び出しの場合にはうまく機能します。

しかし、私は同時に書き込みの負荷をスローすると、Task.Run()コードは接続が閉じられたときに転倒していました。基本的に、コードの並列性は状態他の仕事によって閉鎖されていた。

これは、Task.Run()コード内のConnection.Stateを開くためのチェックを行うことでこれを '固定'しました。これは問題を「解決」したようです。これと同じように:

Task.Run(() => 
      { 
       if (dbConnection.State == ConnectionState.Closed) 
       { 
        dbConnection.Open(); 
       } 

       if (dbConnection.State == ConnectionState.Open) 
       { 
        *Dapper SQL String and Execute Commands* 
       } 
      }); 

私はこの後SSMSからSELECT * FROM sys.dm_exec_connectionsを実行すると、私はより多くの接続を参照してください。期待される?

今、私はそれを理解:

  • Dapperのは
  • SQL Serverは自動的に接続プールに対処する必要があり、接続プールを扱っていませんか?

このソリューションに問題はありますか?それとももっと良い方法ですか?明らかな理由で接続プーリングを使用したいと思います。

ありがとうございます。

+5

まず、Dapperはまだ開いていなければ接続を開きます。次に、Dapperは接続プールからの接続を使用するADO.Netを使用します。最後に、Dapperは 'Task.Run'の代わりに使用できる非同期メソッドを持っています。 – juharr

答えて

1

ありがとうございますJuharr - 私はあなたの返信をupvotedしました。他の人に参考

、私は待つとDapperの非同期する関数を記述変更:

private async Task WriteMessageToDB(Guid id, string tableName, string jsonString) 
    { 
      string sql = *Redacted* 
      await dbConnection.ExecuteScalarAsync<int>(sql, new { ID = id, Body = jsonString }); 
    } 

そして、結果を監視し、発信者に新しいタスクを作成しました。

これは負荷がかけられても一貫して動作しており、過度の新しい接続が作成されていることはありません。

関連する問題