DapperのSQL Azure Transient Fault Handling Frameworkの実装方法

azure-sql-database dapper

質問

私はvb.netの人で、C#の読み込みに問題があります。私はC#DapperをDLLにコンパイルし、それを私のアプリケーションに使用しました。私の主な関心事は、各SQLクエリでSQL Azure用のTransient Fault Handling Frameworkをデフォルトで統合するために、ソースを変更する必要があると私は考えています。

再試行ロジックを接続レベルに追加することができます。これは、ダッパーの上位にあるためですが、ドラッパークラスに埋め込まれている実行クエリレベルではないためです。

誰もまだそれをしていますか?

*更新*

Dapper呼び出しの上でReliableSqlConnectionのみを使用すると、非問合せを実行するリトライ・ロジックが処理されますか?

ここでは、transietnフォールトハングリングでMSからの再試行のサンプルコードです

using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.AzureStorage;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure;
using System.Data;

...

using (ReliableSqlConnection conn = new ReliableSqlConnection(connString, retryPolicy))
{
conn.Open();

IDbCommand selectCommand = conn.CreateCommand();
selectCommand.CommandText = 
  "UPDATE Application SET [DateUpdated] = getdate()";

// Execute the above query using a retry-aware ExecuteCommand method which 
// will automatically retry if the query has failed (or connection was 
// dropped).
int recordsAffected = conn.ExecuteCommand(selectCommand, retryPolicy);

}

ここでDapperコードの実行部分ですが、同じ名前が使用されていますが、カスタム実行関数だと思います

    private static int ExecuteCommand(IDbConnection cnn, IDbTransaction transaction, string sql, Action<IDbCommand, object> paramReader, object obj, int? commandTimeout, CommandType? commandType)
    {
        IDbCommand cmd = null;
        bool wasClosed = cnn.State == ConnectionState.Closed;
        try
        {
            cmd = SetupCommand(cnn, transaction, sql, paramReader, obj, commandTimeout, commandType);
            if (wasClosed) cnn.Open();
            return cmd.ExecuteNonQuery();
        }
        finally
        {
            if (wasClosed) cnn.Close();
            if (cmd != null) cmd.Dispose();
        }
    }

人気のある回答

私は、好ましくはRetryPolicy.ExecuteAction法を用いることにより、Dapperの周りに再試行を包むお勧めします。こうすると、TFHリトライポリシーを使用して、接続へのOPEN呼び出しとコマンド自体の両方が再試行されます。

例えば:

        SqlRetryPolicy.ExecuteAction(() =>
        {
            // Place Dapper ExecuteCommand here: e.g.
            ExecuteCommand(conn,  trans, ... )
        });


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow