SQLサーバーの接続タイムアウト


109

の接続文字列を変更してタイムアウトを増やすことはできますweb.configか?


7
タイムアウトがクエリの実行を制御すると思っていたようにこれを読んではいけません。サーバーに接続するためのタイムアウトだけではなく、 "接続タイムアウト"の方が適切です。stackoverflow.com/a/7976867/409856を
ダウンウィッチ

回答:


213

はい、接続文字列に追加;Connection Timeout=30して、必要な値を指定できます。

Connection Timeoutプロパティに設定されているタイムアウト値は、秒単位で表される時間です。このプロパティが設定されていない場合、接続のタイムアウト値はデフォルト値(15秒)です。

さらに、タイムアウト値をに設定して、0接続の試行が無限の時間待機することを指定しています。ドキュメントで説明されているように、これは接続文字列に設定すべきではありません。

値0は制限がないことを示し、接続の試行は無期限に待機するため、ConnectionStringでは回避する必要があります。


4
このタイムアウトは分または秒単位ですか?
user1 2013

1
@ user1 "試行を終了してエラーを生成するまでにサーバーへの接続を待機する時間(秒単位)。"
Santux 2013

5
参考:接続タイムアウト= 0は無限です。
Abdul Saboor 2013

この例を挙げられますか?私はEF6を使用していAN私はエラータイムアウトいくつかのプロセスのリターンを行うとき、私は私のテーブルに300万データを持っている...注:私は、テーブルにインデックスを使用しています
saulyasar

4
@saulyasarこれは、接続タイムアウトであり、コマンドタイムアウトではありません。接続タイムアウトは、SQLサーバーへの接続を試行する時間の長さです。COMMANDタイムアウトを調査する必要があります。これは、プロシージャまたはステートメントがタイムアウトするまでに実行される時間です。
granadaCoder 2016

32

うーん...

Darinが言ったように、より高い接続タイムアウト値を指定することができますが、それが本当に問題であるとは思えません。

接続タイムアウトが発生した場合、通常は次のいずれかの問題です。

  1. ネットワーク構成-Webサーバー/開発ボックスとSQLサーバー間の接続が遅い。タイムアウトを増やすとこれが修正される場合がありますが、根本的な問題を調査するのが賢明でしょう。

  2. 接続文字列。何らかの理由で、誤ったユーザー名/パスワードが「アクセスが拒否されました」という実際のエラーではなく、タイムアウトエラーを表示する問題を確認しました。これは起こらないはずですが、それは人生です。

  3. 接続文字列2:サーバーの名前を誤って、または不完全に(たとえばのmysqlserver代わりにmysqlserver.webdomain.com)指定すると、タイムアウトが発生します。コマンドラインからの接続文字列で指定されたとおりのサーバー名を使用してサーバーにpingできますか?

  4. 接続文字列3:サーバー名がDNS(またはhostsファイル)にあるが、正しくない、またはアクセスできないIPを指している場合、machine-not-found-ishエラーではなくタイムアウトが発生します。

  5. 呼び出しているクエリがタイムアウトしています。サーバーへの接続に問題があるように見えますが、アプリの構造によっては、タイムアウトが発生する前にクエリが実行されている段階まで到達している可能性があります。

  6. 接続リーク。いくつのプロセスが実行されていますか?オープン接続はいくつありますか?生のADO.NETが接続プールを実行するのか、Enterprise Libraryが必要なときに自動的に接続を閉じるのか、それがすべて構成されているのかはわかりません。これはおそらく赤いニシンです。ただし、WCFとWebサービスを操作する場合、閉じられていない接続でタイムアウトやその他の予測できない動作が発生するという問題がありました。

試すこと:

  1. SQL Management Studioでサーバーに接続するときにタイムアウトが発生しますか?その場合は、ネットワーク構成に問題がある可能性があります。Management Studioとの接続時に問題が発生しない場合、問題はサーバーではなくアプリにあります。

  2. SQLプロファイラーを実行し、実際にネットワーク全体で何が行われているのかを確認します。実際に接続しているかどうか、またはクエリに問題があるかどうかがわかるはずです。

  3. Management Studioでクエリを実行し、所要時間を確認します。

幸運を!


クエリがタイムアウトになると、commandtimeout
user55474

@ user55474おそらく; (非常にまれに)呼び出される方法依存します。
3Dave

このMSDNブログ記事によらない:blogs.msdn.com/b/spike/archive/2008/07/31/...
トムレッドファーン

@hugh珍しいと言ったと思いますが、実際に見たことがあります。
3Dave

1
「Run SQL Profiler」の+1。複雑に聞こえますが、実際には、[ツール]> [SQL Serverプロファイラ]をクリックして、アプリがSQL Serverに伝えていることを確認します。それはオプション#5だったことが
わかります

11

動的に変更したい場合は、SqlConnectionStringBuilderを使用することをお勧めします 。

ConnectionString、つまり文字列をクラスObjectに変換できます。すべての接続文字列プロパティがそのメンバーになります。

この場合の本当の利点は、ConnectionTimeout文字列部分が接続文字列に既に存在するかどうかを心配する必要がないことです。

また、オブジェクトを作成するため、文字列を操作するのではなく、オブジェクトに値を割り当てることが常に適切です。

次にコードサンプルを示します。

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);

2
タイプのConnectionTimeoutプロパティをSqlConnection読み取り専用にするのは良い考えだとは思えません。
Maslow 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.