2017-02-15 5 views
0

Аналогичный (если не тот же вопрос, как) Network path not found exception encountered randomly, но у меня есть код для воспроизведения проблемы, поэтому я хочу снова спросить, поскольку она кажется реальной проблемой независимой оборудования и могут быть воспроизведены.SQL Server «Сетевой путь не найден» Случайно и редко встречается в средах

Вот ошибка:

provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) ---> System.ComponentModel.Win32Exception (0x80004005): The network path was not found at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen()

Для воспроизведения этого я создал консольное приложение, запущенного каждую минуту (мы также имеем тест Щеголеватый DAL, следовательно, параметр):

internal class Program 
{ 
    private static int _totalOpenConnections; 
    private static readonly Stopwatch Timer = new Stopwatch(); 
    private static bool _hasError; 

    private static int Main(string[] args) 
    { 
     var list = Enumerable.Range(1, Settings.Default.TotalCommandsToExecute); 

     // simple ADO.NET test 
     if (args.Length > 0 && args[0].Equals("ado", StringComparison.OrdinalIgnoreCase)) 
     { 
      Console.WriteLine("Beginning ADO.NET Test..."); 

      Timer.Restart(); 

      Parallel.ForEach(list, new ParallelOptions {MaxDegreeOfParallelism = Settings.Default.ConcurrentCount}, 
       i => AsyncContext.Run(async() => 
       { 
        try 
        { 
         PrintStatus(i); 
         await TestADONet(); 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex.ToString()); 
         _hasError = true; 
        } 
       })); 

      Timer.Stop(); 

      Console.WriteLine($"Completed ADO.NET Test in {Timer.ElapsedMilliseconds} ms"); 
     } 

     if (_hasError) 
      return 1; 
     return 0; 
    } 

    private static void PrintStatus(int index) 
    { 
     Console.WriteLine(
      $"Started: {index} of {Settings.Default.TotalCommandsToExecute}\tCurrently Open: {_totalOpenConnections}"); 
    } 

    private static async Task TestADONet() 
    { 
     using (var conn = new SqlConnection(Settings.Default.TestConnection)) 
     { 
      await conn.OpenAsync(); 
      Interlocked.Increment(ref _totalOpenConnections); 

      var command = new SqlCommand("SELECT 1 Field1, 2 Field2, 3 Field3", conn); 
      var reader = await command.ExecuteReaderAsync(); 
      while (reader.Read()) 
      { 
       var result = new TestEntity 
       { 
        Field1 = reader.GetInt32(0), 
        Field2 = reader.GetInt32(1), 
        Field3 = reader.GetInt32(2) 
       }; 
      } 
     } 
     Interlocked.Decrement(ref _totalOpenConnections); 
    } 

    public class TestEntity 
    { 
     public int Field1 { get; set; } 

     public int Field2 { get; set; } 

     public int Field3 { get; set; } 
    } 
} 

Применение настройки ConcurrentCount = 100 и TotalCommandsToExecute = 200. Идея состоит в том, чтобы довольно сильно удалять пул соединений с помощью асинхронных команд.

Это приложение воспроизводит его, однако оно также происходит в производстве в консольных приложениях, веб-приложениях (ASP.NET MVC и ASP.NET WebForms).

Это также происходит довольно случайным образом. У нас было Rackspace, и некоторые администраторы баз данных сканировали среду по этой проблеме безрезультатно, что привело к этому приложению, которое воспроизвело его в среде разработки.

Строка соединения является довольно мягкий, в форме "Data Source =; Database =; User Id =; Пароль ="

SQL Server 2014, но это произошло на двух разных серверах (Dev/Rackspace)

запрос в тесте намеренно доброкачественная

"SELECT 1 Field1, 2 Field2, 3 Field3"

тест действительно использует Nito.AsyncEx, единственный ни система сборки в использовании здесь, чтобы получить поддержку асинхронной. Снова проблема возникает в других приложениях, не использующих эту сборку, поэтому я не думаю, что это проблема. Сообщите мне, если нет, и я воспроизведу ее по-другому.

ЛЮБЫЕ идеи очень ценятся!

+0

Возможно, релевантно: http://dba.stackexchange.com/questions/24165/sql-server-should-we-use-tcp-or-named-pipes-or-use-the-default?noredirect = 1 # comment317809_24165 – ccook

+0

в строке заголовка tcp vs named и статьи: http://devproconnections.com/database-development/sql-server-performance-tip-favoring-tcpip-over-named-pipes – ccook

+0

Другая поддержка источника вверх по tcp vs np lead: http://serverfault.com/questions/30955/sporatic-connection-issues-connecting-to-sql-2005-named-pipes-vs-tcp-ip-issue/31024#31024. В частности, «принудительное использование TCP/IP в строке соединения в конечном итоге решило проблему. Спасибо. - BradC» – ccook

ответ

0

Вопрос был с именованными трубами. Это возможно будет выражено больше в пределах виртуальной машины (спекуляция по ссылкам ниже). Используя TCP/IP, добавив tcp: в строку подключения и указав, что порт решил проблему.

Некоторые родственные случаи:

  1. https://dba.stackexchange.com/questions/24165/sql-server-should-we-use-tcp-or-named-pipes-or-use-the-default
  2. http://devproconnections.com/database-development/sql-server-performance-tip-favoring-tcpip-over-named-pipes
  3. https://serverfault.com/questions/30955/sporatic-connection-issues-connecting-to-sql-2005-named-pipes-vs-tcp-ip-issue/31024#31024
  4. https://dba.stackexchange.com/questions/29106/named-pipes-connection-closed-when-subjected-to-load

Заключение, всегда использование TCP/IP явным образом, если SQL Server не находится на одна и та же машина. Вы можете настроить SQL Server так, чтобы он не принимал именованные каналы, но в будущем я просто добавлю его в строки подключения.

Смежные вопросы