2016-10-13 12 views
1

NuGetパッケージPollyを使用して、フェイルオーバーSQL例外をトラップする再試行ロジックを実装しています。 AzureにSQL Server Always On High Availabilityが設定されています。トラップSQLフェイルオーバー例外

すべてのSQL例外(誤っている)をトラップするのではなく、フェールオーバーが発生したときに発生する特定のSQL例外をトラップする必要があります。

SSMSから、私はダッシュボードを表示してから、コードをテストするために人為的にフェールオーバーを起動することができます。最初は、すべての例外をバブルオーバーさせました(トラップしない)。それから私はフェールオーバーを待ち行列に入れ、私のログを見て、どのようなSQL例外が発生したかを確認します。その後、フェールオーバーのために起こったすべてのSQL例外をトラップできました。

私の質問は、包括的なリストですか? SQL Serverフェールオーバーでリトライロジックを実装した他の人は、他のSQL例外をトラップしますか?

私はロジックで100フェイルオーバーに近いものを試しましたが、何もバブルしませんでした。確かに、私がフェイルオーバーSQL例外の全体を捕らえたというわけではありません。

リトライロジックにはPolicy.Handle(se => IsFailoverSqlException(se))があります。フェールオーバーがキューに置かれているときに私がコード内のどこにいるかによって、私は下にトラップする3つのSQL例外を見ています。あなたは、新しい接続の作成ロジックを簡素化し、単に接続状態をチェックし、必要に応じていないのはなぜ

private static bool IsFailoverSqlException(SqlException se) 
    { 
     return (
       /* 
       A network-related or instance-specific error occurred while establishing a connection to SQL Server. 
       The server was not found or was not accessible. 
       Verify that the instance name is correct and that SQL Server is configured to allow remote connections. 
       */ 
       (se.Class == 20 && se.State == 0 && se.Number == 53) || 
       /* 
       Failed while logging Fatal to MT Database: Unable to access availability database 'MedicusMT' because the database replica is not in the PRIMARY or SECONDARY role. 
       Connections to an availability database is permitted only when the database replica is in the PRIMARY or SECONDARY role. 
       Try the operation again later. 
       */ 
       (se.Class == 14 && se.State == 1 && se.Number == 983) || 
       // A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable) 
       (se.Class == 20 && se.State == 0 && se.Number == -1) 
      ); 
    } 

答えて