連続ループでデータベースからクエリを実行すると、しばらくするとエラーが発生します:
一時的な障害が原因である可能性が高い例外が発生しました。 SQL Azureデータベースに接続する場合は、SqlAzureExecutionStrategyの使用を検討してください。
通常は正常に動作しています。
SQL Databaseに接続するときは、一時的な接続エラーを考慮する必要があります。これらの接続障害は、たとえば、更新のロールアウト、ハードウェア障害などの場合に発生する可能性があります。表示されるエラーは、これらのいずれかが発生したことを示しています。 Anbujが提案する実行戦略を有効にすると、問題が解決するはずです。
EF Coreを使用している場合、回復力のある接続の失敗時の再試行を構成します。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("your_connection_string", builder =>
{
builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
});
base.OnConfiguring(optionsBuilder);
}
ここで説明されているように、実行戦略を有効にします。 https://msdn.Microsoft.com/en-us/data/dn456835.aspx Azure SQL DB向けに設計する場合、一時的な接続障害に備えて設計する必要があります。バックエンドの更新、ハードウェア障害、負荷分散により、断続的な障害が発生することがあるためです。
データベースに接続しようとしているログインのデータベースにユーザーが関連付けられていない場合、このエラーが発生します。
問題の答えを調査している間に多くの問題に直面しているので、私はこの答えを投稿しています。以下は、私が得ていた詳細なエラーメッセージです。
エラーが長すぎるため、パーツのエラーを分割します。
System.Data.Entity.Core.EntityException:*一時的な障害が原因である可能性が高い例外が発生しました。 SQL Azureデータベースに接続する場合は、SqlAzureExecutionStrategyの使用を検討してください。 *--->
System.Data.Entity.Core.EntityCommandExecutionException:コマンド定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。 ---> System.Data.SqlClient.SqlException:リソースID:1.データベースの要求制限は30で、到達しました。詳細については、「 http://go.Microsoft.com/fwlink/?LinkId=267637 」を参照してください。 System.Data.SqlClient.SqlConnection.OnError(SqlException例外、ブール値breakConnection、Action`1 wrapCloseInAction)で
調査の結果、Azure SQL Databaseの最大ログイン数の制限に関連していることがわかりました。私は 'Basic'サービスタイヤを使用していましたが、最大同時ユーザー数は30です。
Azureには、パフォーマンスが大幅に異なる価格帯があります。それを達成するために、彼らは多くのパフォーマンス指標を調整します。 CPUパワー、1分あたりのリクエストなど。
これは、層をプッシュしている場合、CPUパワー/リクエストの量が処理するには大きすぎるため、リクエストがキューに入り始めることを意味します。これによりタイムアウトが発生し、リクエストの処理が待機するにつれてリクエストの制限が大きくなります。最終的に、データベースが本質的にダウンするポイントに到達します。
私の経験では、S0やS1などの低いデータベースレベルはパワー不足であり、開発サイトや非常に基本的なサイト以外には使用しないでください。
Azureポータルには、CPUグラフ、インデックスアドバイザー、クエリパフォーマンスの洞察など、データベースで何が起こっているかをデバッグできる優れたツールがいくつかあります。
関連リンクは次のとおりです:
結論:
パート1:ここで説明したように、実行戦略を有効にします: https://msdn.Microsoft.com/en-us/data/dn456835.aspx .
パート2:Azureのサブスクリプションをアップグレードする必要があります(価格が許す場合)。
ありがとう。
これはTLS設定が原因である可能性があり、.net 4.5フレームワークはデフォルトでtls 1.2をサポートせず、新しいSQL dbは古いtls verと互換性がありません。そのため、マシンでtls 1.0,1.1を無効にするか、.net 4.6.2に更新してください。
データベースがローカルで、たとえばWebAPIである場合、IPアドレスではなくdata source = localhostを指定する必要がある場合があります。いくつかのVPSを使用していて、データソースをlocalhostに設定せずにこのエラーが発生する状況があります。だから、他の誰かがこれを経験していれば、それは彼を助けることができます。
この問題の解決策は、提案された回答を使用することです。SetExecutionStrategy()
を使用して、再試行ポリシーをオンにします。また、Entity Frameworkがメソッドを自動的に実行できるように、クラスDbConfiguration
から派生するようにしてください。
また、接続エラーを作成するコマンドインターセプトを設定して、接続の復元力が実際に機能することを確認して、接続が機能することを確認できるようにします。