C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQL Server DB接続タイムアウト時間について

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■95070 / inTopicNo.1)  SQL Server DB接続タイムアウト時間について
  
□投稿者/ az (8回)-(2020/06/22(Mon) 09:53:30)

分類:[.NET 全般] 

C# (Visual Studio Express 2017 for Windows Desktop)を使って開発しています。
データベース(SQL Server。アプリケーションを動かすところとは別の拠点に存在する)への接続タイムアウトエラーの時間を
デフォルトの15秒より短くしたいと思い、ConnectTimeoutプロパティの値を5, 10などに変更しているのですが
15秒より短くなっていません。15秒が下限なのでしょうか?
また、15秒より短くしたい場合の対処方法について、ほかに手段があるのであれば教えていただけないでしょうか?
引用返信 編集キー/
■95073 / inTopicNo.2)  Re[1]: SQL Server DB接続タイムアウト時間について
□投稿者/ WebSurfer (2070回)-(2020/06/22(Mon) 10:18:13)
No95070 (az さん) に返信

> 15秒より短くなっていません。15秒が下限なのでしょうか?

それはどのように確認したのでしょうか?

できれば、コピペすれば動くようなサンプルコードと再現手順を書いて
ここにアップできませんか?
引用返信 編集キー/
■95076 / inTopicNo.3)  Re[2]: SQL Server DB接続タイムアウト時間について
□投稿者/ az (9回)-(2020/06/22(Mon) 10:47:51)
フォームにボタンを配置し、
ボタンをクリックしたらDBに接続しようとするテストコードを書きました。
ただし、タイムアウト動作確認のため、指定したIPアドレスには(物理的に)接続しないものとします。


private void button1_Click(object sender, EventArgs e)
{
    try
    {
        // 接続文字列の取得
        var connectionString = @"Data Source=192.168.66.55;" ※ここで指定したIPアドレスのコンピュータはネットワーク上にない
        + @"Integrated Security=False;"
        + @"User ID=sa;"
        + @"Password=XXX;"
        + @"Connection Timeout=10"; ※ここでタイムアウト時間を設定

        // データベース接続の準備
        var connection = new SqlConnection(connectionString);

        // データベースの接続開始
        connection.Open();



    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.ErrorCode.ToString());
    }
}

■No95073 (WebSurfer さん) に返信
> ■No95070 (az さん) に返信
> 
>>15秒より短くなっていません。15秒が下限なのでしょうか?
> 
> それはどのように確認したのでしょうか?
> 
> できれば、コピペすれば動くようなサンプルコードと再現手順を書いて
> ここにアップできませんか?

引用返信 編集キー/
■95077 / inTopicNo.4)  Re[3]: SQL Server DB接続タイムアウト時間について
□投稿者/ WebSurfer (2071回)-(2020/06/22(Mon) 11:27:24)
No95076 (az さん) に返信

質問者さんとやり方が違いますが、以下の記事で確認できたという話がありますが。

SqlConnectionの接続タイムアウトを確認してみる
https://ichiroku11.hatenablog.jp/entry/2016/02/25/213502

質問者さんと違うのは、存在しない IP ではなく、存在する SQL Server に接続する
ように接続文字列を設定、SQL Server を停止して確認、lpc: を付与して共有メモリ
での接続を強制、ConnectTimeout = 1 とした・・・でしょうか。
引用返信 編集キー/
■95078 / inTopicNo.5)  Re[4]: SQL Server DB接続タイムアウト時間について
□投稿者/ az (10回)-(2020/06/22(Mon) 15:04:22)
回答ありがとうございます。
もともと、この処理で「接続先が存在するかどうか」の判別も行えるかと考えていたのですが、
その場合は、SqlConnectionの接続結果を見るのではなく、
あらかじめ別に接続先の存在確認をしたほうが良いのでしょうか。
(15秒以上ユーザに待たせない処理が実現できるのでしょうか)
引用返信 編集キー/
■95079 / inTopicNo.6)  Re[5]: SQL Server DB接続タイムアウト時間について
□投稿者/ WebSurfer (2072回)-(2020/06/22(Mon) 15:50:14)
No95078 (az さん) に返信

> もともと、この処理で「接続先が存在するかどうか」の判別も行えるかと考えていたのですが、
> その場合は、SqlConnectionの接続結果を見るのではなく、
> あらかじめ別に接続先の存在確認をしたほうが良いのでしょうか。

そうだと思います。(あらかじめ別に接続先の存在確認をしたほうが良いと思います。) 存在し
ていてもネットワーク障害などで一時的に接続できない場合もあるでしょうから。

> (15秒以上ユーザに待たせない処理が実現できるのでしょうか)

接続できないというのは、多分、ネットワーク障害や DB サーバーダウンの場合がほとんどだと思い
ますが、そういう場合はその旨ユーザーに通知して、対処が植わるまで待ってもらう以外は何ともな
らないかと。


ただ、データベースがクラウドデータベースサービスに配置された場合、一時的な接続エラーの発生
が頻繁に発生する可能性が高くなるとか、他のユーザーと共有されるためサービスの応答性が影響を
受ける可能性が高くなるとかがあって、その対応のため、Entity Framework の接続の復元機能を利
用して、失敗した SQL クエリを再試行するプロセスを自動化するということが可能だそうです。

ASP.NET MVC アプリの話ですが、具体的にどういう手段かの詳細は以下の記事にあります。興味があ
れば読んでください。

チュートリアル: ASP.NET MVC アプリの Entity Framework で接続の回復性とコマンドインターセプトを使用する
https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/connection-resiliency-and-command-interception-with-the-entity-framework-in-an-asp-net-mvc-application


サーバー名の代わりに IP アドレスを使って SQL Server に接続に行くと、TCP/IP プロトコルを使
って接続に行くようですが、質問者さんが最初の質問で書いたコードではその影響もあったかもし
れません。

IP アドレスで SQL Server に接続
http://surferonwww.info/BlogEngine/post/2016/03/18/connecting-to-sql-server-using-ip-address-instead-of-server-name.aspx

あと、プロトコルを指定しないと、(1) 共有メモリ ⇒ (2) TCP/IP ⇒ (3) 名前付きパイプの順に
接続をトライしていくようで、そのあたりの影響もあるのかも。

SQL Server 接続プロトコル順序
http://surferonwww.info/BlogEngine/post/2016/11/16/sql-server-connection-protocol-order.aspx

また、紹介した前者の記事からリンクが張ってある「Troubleshooting Connectivity #1 - SQL Server
への接続」によると、SQL Server に接続する場合、以下の 3 つのステップにで処理が行われるそうで
すが、それと ConnectTimeout がどう関係するのか、いろいろあって、自分もよくわかっていません。

1. OS レベルのセッション確立
2. ログイン認証
3. データベースアクセス

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ