web.config
の接続文字列を変更してタイムアウトを増やすことはできますか?
はい、 接続文字列 に;Connection Timeout=30
を追加して、希望する値を指定できます。
Connection Timeout
プロパティで設定されるタイムアウト値は、秒単位で表される時間です。このプロパティが設定されていない場合、接続のタイムアウト値はデフォルト値(15秒)です。
さらに、タイムアウト値を0
に設定すると、接続の試行が無限の時間待機するように指定できます。ドキュメントで説明されているように、これは接続文字列に設定しないでください。
値0は制限がないことを示し、接続の試行は無期限に待機するため、ConnectionStringでは避ける必要があります。
うーん...
ダリンが言ったように、より高い接続タイムアウト値を指定できますが、それが本当に問題だとは思いません。
接続タイムアウトが発生する場合、通常は次のいずれかの問題です。
ネットワーク構成-Webサーバー/開発ボックスとSQLサーバー間の接続が遅い。タイムアウトを増やすとこれを修正できますが、根本的な問題を調査するのが賢明です。
接続文字列。間違ったユーザー名/パスワードが何らかの理由で「アクセス拒否」を示す実際のエラーの代わりにタイムアウトエラーを発生させる問題を見てきました。これは起こるべきではありませんが、それは人生です。
接続文字列2:サーバーの名前を誤って、または不完全に指定している場合(たとえば、mysqlserver.webdomain.com
ではなくmysqlserver
)、タイムアウトが発生します。サーバー名接続文字列で指定されたとおりをコマンドラインから使用してサーバーにpingできますか?
接続文字列3:サーバー名がDNS(またはhostsファイル)にあるが、不正またはアクセスできないIPを指している場合、machine-not-found-ishエラーではなくタイムアウトが発生します。
呼び出しているクエリはタイムアウトになっています。サーバーへの接続が問題のように見えますが、アプリの構造によっては、タイムアウトが発生する前にクエリが実行される段階まで到達する可能性があります。
接続リーク。実行中のプロセスの数オープン接続はいくつですか?未加工のADO.NETが接続プーリングを実行するか、必要な場合は自動的に接続を閉じるか、またはすべてが構成されているかはわかりません。これはおそらくニシンです。ただし、WCFおよびWebサービスを使用する場合、閉じられていない接続でタイムアウトやその他の予測できない動作が発生する問題がありました。
試すべきこと:
SQL Management Studioを使用してサーバーに接続するときにタイムアウトが発生しますか?その場合、ネットワーク構成が問題である可能性があります。 Management Studioとの接続時に問題が発生しない場合、問題はサーバーではなくアプリにあります。
SQLプロファイラーを実行し、実際にネットワーク上で何が起こっているかを確認します。実際に接続しているかどうか、またはクエリに問題があるかどうかを判断できるはずです。
Management Studioでクエリを実行し、所要時間を確認します。
がんばろう!
動的に変更したい場合は、 SqlConnectionStringBuilder 。
ConnectionString、つまり文字列をクラスオブジェクトに変換できます。すべての接続文字列プロパティはそのメンバーになります。
この場合、実際の利点は、ConnectionTimeout文字列部分が接続文字列に既に存在するかどうかを心配する必要がないことです。
また、オブジェクトを作成するため、文字列を操作するのではなく、オブジェクトに値を割り当てるのが常に適切です。
コードサンプルは次のとおりです。
var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);
sscsb.ConnectTimeout = 30;
var conn = new SqlConnection(sscsb.ConnectionString);