Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment accélérer le délai d'expiration de SqlConnection

Il semble que tous les cas qui causaient de longs retards pourraient être résolus beaucoup plus rapidement en tentant une connexion socket directe comme ceci :

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

Je vais utiliser ce code pour vérifier si le serveur répond sur le port SQL Server et n'essayer d'ouvrir une connexion que si c'est le cas. Je pensais (basé sur l'expérience des autres) qu'il y aurait un délai de 30 secondes même à ce niveau, mais je reçois un message indiquant que la machine "a activement refusé la connexion" sur ces derniers tout de suite.

Modifier : Et si la machine n'existe pas, elle me le dit tout de suite aussi. Aucun délai de 30 secondes que je ne puisse trouver.

Modifier : Les machines qui étaient sur le réseau mais qui ne sont pas éteintes prennent encore 30 secondes pour échouer, je suppose. Cependant, les machines protégées par un pare-feu échouent plus rapidement.

Modifier : Voici le code mis à jour. J'ai l'impression qu'il est plus propre de fermer un socket que d'abandonner un thread :

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