SqlClientでリトライロジックを設定

適用対象: .NET Framework .NET .NET Standard

ADO.NET のダウンロード

この記事では、指数関数的なリトライプロバイダーを作成し、それを SqlConnectionに割り当てる方法を紹介しています。 プロバイダーはドライバーの組み込みの一時的な接続エラーリストを再試行し、最大5回まで接続を開放しようと試みます。

前提条件

  • Microsoft。Data.SqlClient 3.0またはそれ以降のバージョンです。
  • SQL Server、Azure SQL Database、Azure SQL Managed Instance、またはMicrosoft FabricのSQLデータベース用の接続文字列です。

接続再試行プロバイダーの設定

  1. 再試行の選択肢を定義してください。 プロバイダーが内蔵の一時的エラーリストを使えるようにTransientErrorsをそのままnullにしてください。

    // Define the retry logic parameters
    var options = new SqlRetryLogicOption()
    {
        // Tries 5 times before throwing an exception
        NumberOfTries = 5,
        // Preferred gap time to delay before retry
        DeltaTime = TimeSpan.FromSeconds(1),
        // Maximum gap time for each delay time before retry
        MaxTimeInterval = TimeSpan.FromSeconds(20)
    };
    
  2. 選択肢からプロバイダーを作成しましょう。

    // Create a retry logic provider
    SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
    
  3. 接続を開く前にプロバイダーを割り当ててください。

    // Assumes that connection is a valid SqlConnection object 
    // Set the retry logic provider on the connection instance
    connection.RetryLogicProvider = provider;
    // Establishing the connection will retry if a transient failure occurs.
    connection.Open();
    

NumberOfTries = 5 初回1回の挑戦と最大4回の再挑戦が可能です。 指数関数的な供給者は、試行間隔を広げ、ランダムジッターを追加します。 MaxTimeInterval は、すべての試行における合計経過時間ではなく、各遅延に上限を設けます。

コマンドリトライの設定

別のプロバイダーを作成し、 SqlCommand.RetryLogicProviderに割り当ててください。 true を、アプリケーションが安全に再実行できるコマンドに対してのみ SqlRetryLogicOption.AuthorizedSqlCondition を返す述語に設定してください。

Caution

組み込みのプロバイダーは、接続にアクティブなトランザクションがある場合にコマンドをやり直しません。 一時的な障害でトランザクションが無効になった場合は、ロールバックしてトランザクション全体を再試行してください。 失敗した文だけをやり直さないでください。

設定 SqlRetryLogicOption.TransientErrors はドライバーの内蔵エラーリストを置き換えます。 デフォルトを失わずにベースラインを拡張するには、「 組み込みの過渡エラーリストを拡張する」をご覧ください。