Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да направите SqlConnection таймаут по-бързо

Изглежда, че всички случаи, които са причинявали големи забавяния, могат да бъдат разрешени много по-бързо, като опитате директна връзка чрез сокет като тази:

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

Ще използвам този код, за да проверя дали сървърът отговаря на порта на SQL Server и ще се опитам да отворя връзка само ако го направи. Мислех (въз основа на опита на други), че ще има забавяне от 30 секунди дори на това ниво, но веднага получавам съобщение, че машината „активно е отказала връзката“.

Редактиране: И ако машината не съществува, тя също ми казва това веднага. Няма закъснения от 30 секунди, които мога да намеря.

Редактиране: Предполагам, че машини, които са били в мрежата, но не са изключени, продължават да се провалят след 30 секунди. Машините със защитна стена обаче отказват по-бързо.

Редактиране: Ето актуализирания код. Чувствам, че е по-чисто да затворя сокет, отколкото да прекъсна нишка:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извлека записи за последните 30 минути в MS SQL?

  2. Разлика във времето за изпълнение на SQL Stored Procedure

  3. Обединяване на дублиращи се времеви записи в база данни

  4. Изтриване на свързани редове в релация много към много

  5. писане на функция в sql сървър