Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So machen Sie das SqlConnection-Timeout schneller

Es sieht so aus, als könnten alle Fälle, die zu langen Verzögerungen führten, viel gelöst werden schneller, indem Sie versuchen, eine direkte Socket-Verbindung wie folgt herzustellen:

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);
   }
}

Ich werde diesen Code verwenden, um zu prüfen, ob der Server auf dem SQL Server-Port antwortet, und nur dann versuchen, eine Verbindung zu öffnen, wenn dies der Fall ist. Ich dachte (basierend auf der Erfahrung anderer), dass es selbst bei dieser Stufe zu einer Verzögerung von 30 Sekunden kommen würde, aber ich erhalte eine Meldung, dass der Computer die Verbindung auf diesen sofort "aktiv abgelehnt" hat.

Bearbeiten: Und wenn die Maschine nicht existiert, sagt sie mir das auch gleich. Keine 30-Sekunden-Verzögerung, die ich finden kann.

Bearbeiten: Computer, die im Netzwerk waren, aber nicht ausgeschaltet sind, brauchen immer noch 30 Sekunden, bis sie ausfallen, denke ich. Die Maschinen mit Firewall fallen jedoch schneller aus.

Bearbeiten: Hier ist der aktualisierte Code. Ich habe das Gefühl, dass es sauberer ist, einen Socket zu schließen, als einen Thread abzubrechen:

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);
   }
}