sql >> データベース >  >> RDS >> Sqlserver

SqlConnection のタイムアウトをより速くする方法

    長い遅延を引き起こしていたすべてのケースがかなり解決できたようです 次のような直接ソケット接続を試みることで、より迅速に:

    foreach (string svrName in args)
    {
       try
       {
          System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(svrName, 1433);
          if (tcp.Connected)
             Console.WriteLine("Opened connection to {0}", svrName);
          else
             Console.WriteLine("{0} not connected", svrName);
          tcp.Close();
       }
       catch (Exception ex)
       {
          Console.WriteLine("Error connecting to {0}: {1}", svrName, ex.Message);
       }
    }
    

    このコードを使用して、サーバーが SQL Server ポートで応答するかどうかを確認し、応答する場合にのみ接続を開こうとします。このレベルでも 30 秒の遅延があると (他の人の経験に基づいて) 思っていましたが、すぐにマシンが「積極的に接続を拒否しました」というメッセージが表示されます。

    編集: また、そのマシンが存在しない場合は、すぐにそのことも教えてくれます。私が見つけることができる 30 秒の遅延はありません。

    編集: ネットワーク上にあり、電源がオフになっていないマシンでも、失敗するまでに 30 秒かかると思います。ただし、ファイアウォールで保護されたマシンはより速く失敗します。

    編集: これが更新されたコードです。スレッドを中止するよりもソケットを閉じる方がクリーンだと思います:

    static void TestConn(string server)
    {
       try
       {
          using (System.Net.Sockets.TcpClient tcpSocket = new System.Net.Sockets.TcpClient())
          {
             IAsyncResult async = tcpSocket.BeginConnect(server, 1433, ConnectCallback, null);
             DateTime startTime = DateTime.Now;
             do
             {
                System.Threading.Thread.Sleep(500);
                if (async.IsCompleted) break;
             } while (DateTime.Now.Subtract(startTime).TotalSeconds < 5);
             if (async.IsCompleted)
             {
                tcpSocket.EndConnect(async);
                Console.WriteLine("Connection succeeded");
             }
             tcpSocket.Close();
             if (!async.IsCompleted)
             {
                Console.WriteLine("Server did not respond");
                return;
             }
          }
       }
       catch(System.Net.Sockets.SocketException ex)
       {
          Console.WriteLine(ex.Message);
       }
    }
    


    1. ajax関数とphpで行を削除します

    2. 2 つの日付パラメーターの間およびそれらを含む日付を一時テーブルに入力する最も簡単な方法

    3. 別のユーザーとしてMySQLにログインする方法は?

    4. テーブルから n 番目に高い給与を調べる