give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

SQL Serverに.NETで接続しようとすると1.2秒でタイムアウトする場合がある

ちょっと前に発生していたトラブルの情報共有です。


検証用にリリースした社内アプリケーションが頻繁にタイムアウトエラーを起こすというトラブルが先日発生しました。
.NETから社内のSQL Serverに接続していたのですが、デフォルトのタイムアウト秒数は15秒なので、さすがに15秒も接続できないということはないだろうと首を傾げていました。
念のためクライアントマシンのスペックやエラー発生時のDBの負荷等を確認したものの、これといった要因は見つかりませんでした。


仕方が無いのでGoogleであれこれキーワードを変えながら検索していると、以下のトピックを見つけました。



FIX: Time-out error when a mirrored database connection is created by the .NET Framework data provider for SQLClient


この記事によると、.NETのSqlClientからミラーリングされたSQL Serverに接続しようとすると、わずか1.2秒でタイムアウトする場合があるそうです。
原因はどうやら接続再試行アルゴリズムの不具合だそうです。
修正の予定はあるそうですが、今のところ修正プログラムは配布されていないようです。


MSのWebサイトには「DBやネットワークのパフォーマンスを上げろ」という解決策が載っていますが、コストをかけずにすぐ実現できる話ではありません。
なので、現実的な回避策はタイムアウト秒数を上げることになります。


実は1.2秒という数字は15秒×0.08で算出された秒数です。
そこでたとえばタイムアウト秒数を10倍の150秒にすると、タイムアウト秒数も12秒に伸びます。
こちらもあまりスマートな解決策ではありませんが、現状では仕方がないかもしれません。
ちなみに接続文字列でタイムアウト秒数を変更する方法はこちらに載っています。




SqlConnection.ConnectionTimeout プロパティ (System.Data.SqlClient)


この回避策を実施してからはタイムアウトエラーが発生しなくなったので、やはり原因と対策はこれで間違いなかったものと思われます。


.NETアプリケーションからミラーリングされたSQL Serverに接続する場合は、こうした問題に気をつけてください。
以上、ご参考までに。