sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo hacer que el tiempo de espera de SqlConnection sea más rápido

Parece que todos los casos que estaban causando largas demoras podrían resolverse mucho más rápidamente al intentar una conexión de socket directa como esta:

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

Voy a usar este código para verificar si el servidor responde en el puerto de SQL Server y solo intentaré abrir una conexión si lo hace. Pensé (según la experiencia de otros) que habría un retraso de 30 segundos incluso en este nivel, pero recibo un mensaje de que la máquina "rechazó activamente la conexión" en estos de inmediato.

Editar: Y si la máquina no existe, me lo dice enseguida también. No puedo encontrar retrasos de 30 segundos.

Editar: Supongo que las máquinas que estaban en la red pero no están apagadas aún tardan 30 segundos en fallar. Sin embargo, las máquinas con cortafuegos fallan más rápido.

Editar: Aquí está el código actualizado. Siento que es más limpio cerrar un socket que abortar un hilo:

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