sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man gör SqlConnection timeout snabbare

Det verkar som att alla fall som orsakade långa förseningar kunde lösas mycket snabbare genom att försöka göra en direkt socket-anslutning så här:

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

Jag ska använda den här koden för att kontrollera om servern svarar på SQL Server-porten och försöker bara öppna en anslutning om den gör det. Jag trodde (baserat på andras erfarenhet) att det skulle bli 30 sekunders fördröjning även på den här nivån, men jag får ett meddelande om att maskinen "aktivt vägrade anslutningen" på dessa direkt.

Redigera: Och om maskinen inte finns säger den mig det direkt också. Inga 30-sekunders förseningar som jag kan hitta.

Redigera: Maskiner som fanns på nätverket men inte är avstängda tar fortfarande 30 sekunder att misslyckas antar jag. De brandväggsdatorerna misslyckas dock snabbare.

Redigera: Här är den uppdaterade koden. Jag tycker att det är renare att stänga ett uttag än att avbryta en tråd:

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. Optimera en UNION mysql-fråga

  2. Formatera datum i PostgreSQL

  3. MySQL fulltextsökning efter hashtags (inklusive #-symbolen i index)

  4. Hämta mp4-filtaggar