Поставщик TCP: существующее соединение было принудительно закрыто удаленным хостом

У меня проблемы с клиентами SQL, которые случайно отключаются от сервера с помощью TCP-соединения, принудительно закрывают сообщение об ошибке.

Настройка выглядит следующим образом:

  • SQL 2014 Express работает на Windows Server 2008.
  • Клиентами являются подключенные к Wi-Fi Microsoft Surface 3-Standard или 4-PRO, работающие под управлением Windows 10 версии 1703.
  • Инфраструктура Wi-Fi в большинстве случаев - это Aruba AP-105, несколько точек доступа Cisco в некоторых местах.
  • Клиентское приложение (написанное на VB6 с использованием драйверов базы данных SQLNCLI 11) регулярно устанавливает соединения с сервером SQL (каждые 15 секунд или около того).

Случайно соединение SQL будет разорвано, сообщая

  • "Поставщик TCP: существующее соединение было принудительно закрыто удаленным хостом".

Это может произойти в любое время (в том числе в середине использования приложения), не обязательно после того, как ПК неактивен в течение определенного периода времени.

У нас есть клиенты, подключенные к проводным сетевым подключениям, и они никогда не прекращают подключение, что позволяет нам полагать, что проблема связана с кратковременными отключениями Wi-Fi.

При тестировании мы не можем воспроизвести ошибку, программное обеспечение восстанавливается даже при выключении Wi-Fi (и любых других проблемах в локальной сети, о которых мы можем думать) и включении без указания ошибки.

Google был очень "полезен", и есть много ссылок на эту проблему, часто ссылающихся на настройки TCP Chimney Offload на сервере. Как только мы поняли, что это было, их судили, но ничего не изменилось.

Итак, кто-нибудь может подсказать, что может происходить?

Мы исторически использовали драйверы SQLOLEDB и получали ошибки "Общий сбой сети" (не особенно полезные!), Переключились на SQLNCLI, чтобы посмотреть, улучшило ли это ситуацию, чего не произошло, но раскрыло реальное сообщение об ошибке.

Строка подключения выглядит следующим образом:

sqlConnectionString = "Provider=SQLNCLI11;" & _
                      "Server=" & gblSQLDataSource & ";" & _
                      "Database=" & strDB & ";" & _
                      "Uid=" & oUser.DecryptSQLUser & ";" & _
                      "Pwd=" & oUser.DecryptSQLPass & ";" & _
                      "MARS Connection=True;" & _
                      "DataTypeCompatibility=80;"

Джим

1 ответ

У меня была такая же проблема, и я нашел обходной путь. Проверьте, есть ли в вашей команде sql предложение «with (nolock)», это означает, что вы читаете незафиксированные данные из таблицы, и если в этой таблице есть большие объекты, такие как big varchar(max), тогда хост sql иногда отключает соединение. В моей ситуации это было примерно каждые 10-15 минут, поэтому, когда я удалил «с (без блокировки)», проблема была исправлена.

Другие вопросы по тегам