sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan får du SqlConnection timeout hurtigere

Det ser ud til, at alle de sager, der forårsagede lange forsinkelser, kunne løses meget hurtigere ved at forsøge en direkte stikforbindelse som denne:

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

Jeg vil bruge denne kode til at kontrollere, om serveren reagerer på SQL Server-porten, og kun forsøge at åbne en forbindelse, hvis den gør det. Jeg troede (baseret på andres erfaringer), at der ville være 30 sekunders forsinkelse selv på dette niveau, men jeg får en besked om, at maskinen "aktivt afviste forbindelsen" på disse med det samme.

Rediger: Og hvis maskinen ikke findes, fortæller den mig det også med det samme. Ingen 30 sekunders forsinkelser, som jeg kan finde.

Rediger: Maskiner, der var på netværket, men som ikke er slukket, tager stadig 30 sekunder om at fejle. Firewalled maskiner fejler dog hurtigere.

Rediger: Her er den opdaterede kode. Jeg synes, det er renere at lukke en fatning end at afbryde 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. Tæller nej. af poster fra flere tabeller; Oracle DB

  2. Hvordan bestemmer du, hvilke SQL-tabeller der har en identitetskolonne programmatisk

  3. sql for at vælge én post for hver måned med en sum af månedens poster

  4. SQL - to måneder fra dagens dato i Oracle