У меня была та же проблема, хотя это было с запросами на обслуживание к SQL DB.
Вот что было в моем сервисном журнале ошибок:
System.Data.SqlClient.SqlException: при отправке запроса на сервер произошла ошибка транспортного уровня. (provider: TCP Provider, error: 0-существующее соединение было принудительно закрыто удаленным хостом.)
У меня есть набор тестов C#, который тестирует службу. Служба и DB были оба на внешних серверах, поэтому я подумал, что это может быть проблемой. Поэтому я развернул службу и DB локально, но безрезультатно. Проблема продолжалась. Набор тестов даже не является жестким тестом производительности, поэтому я понятия не имел, что происходит. Один и тот же тест проваливался каждый раз, но когда я отключал этот тест, другой проваливался непрерывно.
Я попробовал другие методы, предложенные в Интернете, которые тоже не сработали:
- Увеличьте значения реестра TcpMaxDataRetransmissions и TcpMaxConnectRetransmissions .
- Отключите параметр «Shared Memory» в Диспетчере конфигурации сервера SQL в разделе «Client Protocols» и отсортируйте TCP/IP на 1-е место в списке.
- Это может произойти при тестировании масштабируемости с большим количеством попыток подключения клиента. Чтобы устранить эту проблему, используйте утилиту regedit.exe для добавления нового значения DWORD с именем SynAttackProtect в раздел реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters с данными значения 00000000.
Моим последним средством было использовать старую поговорку «Try and try again». Поэтому я вложил операторы try-catch, чтобы гарантировать, что если соединение TCP/IP потеряно в Нижнем протоколе связи,то он не просто сдается, но пытается снова. Теперь это работает для меня, однако это не очень элегантное решение.
SQL Server 2008 Standard SQL Server 2008 Developer SQL Server 2008 Workgroup SQL Server 2008 Enterprise SQL Server 2008 Express SQL Server 2008 R2 Standard SQL Server 2008 R2 Developer SQL Server 2008 R2 Workgroup SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Express Еще…Меньше
Проблемы
Рассмотрим следующий сценарий.
-
Клиентское приложение подключается к экземпляру Microsoft SQL Server 2008 или Microsoft SQL Server 2008 R2.
-
Время ожидания запроса происходит, когда SQL Server сбрасывает соединение между SQL Server 2008 или SQL Server 2008 R2 и клиентским приложением. Кроме того, клиентское приложение отправляет сигнал предупреждения явным образом, отменяя запрос к экземпляру SQL Server.
В этом случае SQL Server выполняет принудительное закрытие соединения, и вы можете получить одно из следующих сообщений об ошибке:
-
Сообщение об ошибке 1
При текущей команде возникла серьезная ошибка. Результаты, если таковые имеются, должны быть удалены.
-
Сообщение об ошибке 2
Произошла ошибка на транспортном уровне при получении результатов с сервера. (поставщик: поставщик услуг TCP; ошибка: 0-существующее подключение было принудительно закрыто удаленным узлом.)
Кроме того, в файле Errorlog сервера SQL Server регистрируется сообщение об ошибке, похожее на приведенное ниже.
<Дата><время> <SPID> ошибка: 18056, серьезность: 20, состояние: 29. <Дата><время> <SPID> клиент не смог повторно использовать сеанс с <SPID>, который был сброшен для группировки подключений. КОД ошибки — 29. Эта ошибка может быть вызвана тем, что предыдущая операция завершилась сбоем. Перед сообщением об ошибке Проверьте журналы ошибок на предмет невыполненных операций сразу.
Решение
Сведения о накопительном пакете обновления
SQL Server 2008 R2 с пакетом обновления 2 (SP2)
Исправление для этой проблемы впервые выпущено в накопительном обновлении 1 для SQL Server 2008 R2 с пакетом обновления 2. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2720425 Накопительный пакет обновления 1 для SQL Server 2008 R2 с пакетом обновления 2 (SP2)Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2730301 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2 с пакетом обновления 2 (SP2)
SQL Server 2008 с пакетом обновления 3
Исправление для этой проблемы впервые выпущено в накопительном обновлении 6 для SQL Server 2008 с пакетом обновления 3. Чтобы получить дополнительные сведения об этом накопительном пакете обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2715953 Накопительный пакет обновления 6 для SQL Server 2008 с пакетом обновления 3 (SP3)Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008. Корпорация Microsoft рекомендует установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2629969 Сборки SQL Server 2008, выпущенные после выпуска пакета обновления 3 (SP3) для SQL Server 2008 Исправления Microsoft SQL Server 2008 создаются для конкретных пакетов обновления для SQL Server. Вы должны применить исправление SQL Server 2008 с пакетом обновления 3 (SP3) к установке SQL Server 2008 с пакетом обновления 3 (SP3). По умолчанию любое исправление, предоставленное в пакете обновления SQL Server, входит в следующий пакет обновления для SQL Server.
SQL Server 2008 R2
Исправление для этой проблемы впервые выпущено в накопительном обновлении 14. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2008 R2, щелкните следующий номер статьи базы знаний Майкрософт:
2703280 Накопительный пакет обновления 14 для SQL Server 2008 R2 Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
981356 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2
SQL Server 2008 с пакетом обновления 1
Исправление для этой проблемы впервые выпущено в накопительном обновлении 14 для SQL Server 2008 с пакетом обновления 1 (SP1). Чтобы получить дополнительные сведения об этом накопительном пакете обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2527187 Накопительный пакет обновления 14 для SQL Server 2008 с пакетом обновления 1 (SP1)Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008. Корпорация Microsoft рекомендует установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
956909 Сборки SQL Server 2008, выпущенные после выпуска SQL Server 2008 Исправления Microsoft SQL Server 2008 создаются для конкретных пакетов обновления для SQL Server. Вы должны применить исправление для SQL Server 2008 с пакетом обновления 1 (SP1) к установке SQL Server 2008 с пакетом обновления 1. По умолчанию любое исправление, предоставленное в пакете обновления SQL Server, входит в следующий пакет обновления для SQL Server.
SQL Server 2008 с пакетом обновления 2
Исправление для этой проблемы впервые выпущено в накопительном обновлении 10 для SQL Server 2008 с пакетом обновления 2. Чтобы получить дополнительные сведения об этом накопительном пакете обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2696625 Накопительный пакет обновления 10 для SQL Server 2008 с пакетом обновления 2 (SP2)Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008. Корпорация Microsoft рекомендует установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2402659 Сборки SQL Server 2008, выпущенные после выпуска пакета обновления 2 (SP2) для SQL Server 2008 Исправления Microsoft SQL Server 2008 создаются для конкретных пакетов обновления для SQL Server. Необходимо применить исправление для SQL Server 2008 с пакетом обновления 2 (SP2) к установке SQL Server 2008 с пакетом обновления 2. По умолчанию любое исправление, предоставленное в пакете обновления SQL Server, входит в следующий пакет обновления для SQL Server.
SQL Server 2008 R2 с пакетом обновления 1 (SP1)
Исправление для этой проблемы впервые выпущено в накопительном обновлении 6 для SQL Server 2008 R2 с пакетом обновления 1 (SP1). Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2679367 Накопительный пакет обновления 6 для SQL Server 2008 R2 с пакетом обновления 1 (SP1)Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2567616 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2 с пакетом обновления 1 (SP1)
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе «Применяется к».
Дополнительная информация
Дополнительные сведения об этой проблеме, включая шаги по устранению неполадок, приведены в следующей записи блога из команды службы SQL Server эскалации:
http://blogs.msdn.com/b/psssql/archive/2010/05/05/error-18056-can-be-unwanted-noise-in-certain-scenarios.aspx
Нужна дополнительная помощь?
У меня была такая же проблема, хотя и с запросами на обслуживание в базе данных SQL.
Вот что у меня было в журнале ошибок службы:
System.Data.SqlClient.SqlException: при отправке запроса на сервер произошла ошибка транспортного уровня. (поставщик: поставщик TCP, ошибка: 0 — существующее соединение было принудительно закрыто удаленным узлом.)
У меня есть набор тестов C #, который тестирует службу. Служба и БД были на внешних серверах, поэтому я подумал, что это может быть проблемой. Поэтому я развернул службу и БД локально, но безрезультатно. Вопрос продолжился. Набор тестов даже не является жестким тестом производительности, поэтому я понятия не имел, что происходит. Один и тот же тест каждый раз терпел неудачу, но когда я отключил этот тест, другой тест не удался постоянно.
Я пробовал другие методы, предложенные в Интернете, которые тоже не сработали:
- Увеличьте значения реестра TcpMaxDataRetransmissions и TcpMaxConnectRetransmissions.
- Отключите параметр «Общая память» в диспетчере конфигурации SQL Server в разделе «Клиентские протоколы» и отсортируйте TCP / IP до 1-го места в списке.
- Это может произойти, когда вы тестируете масштабируемость с большим количеством попыток подключения клиентов. Чтобы решить эту проблему, используйте служебную программу regedit.exe, чтобы добавить новое значение DWORD с именем SynAttackProtect в раздел реестра HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services Tcpip Parameters с данными значения 00000000.
Моим последним средством было использовать старость, говорящую «Попробуй и попробуй еще раз». Поэтому у меня есть вложенные операторы try-catch, чтобы гарантировать, что если соединение TCP / IP потеряно в нижнем протоколе связи, оно не просто откажется от этого, а попытается снова. Теперь это работает для меня, но это не очень элегантное решение.
12 ответов
Я отправил ответ на другой вопрос по другой теме, которая может быть использована здесь. Этот ответ включал соединения SMB, а не SQL. Однако он был идентичен, поскольку он касался транспортной ошибки низкого уровня.
Мы обнаружили, что в ситуации с тяжелой нагрузкой удаленному серверу довольно легко отключать соединения на уровне TCP просто потому, что сервер занят. Одной из причин было то, что по умолчанию количество попыток повторной передачи данных в Windows не подходит для нашей ситуации.
Посмотрите параметры реестра для настройки TCP/IP в Windows. В частности, вы хотите посмотреть TcpMaxDataRetransmissions и, возможно, TcpMaxConnectRetransmissions. По умолчанию они равны 5 и 2, попробуйте немного увеличить их в клиентской системе и дублируйте ситуацию загрузки.
Не сойди с ума! TCP удваивает тайм-аут при каждой последующей повторной передаче, поэтому поведение таймаута для плохих соединений может оказаться экспоненциальным, если вы увеличите их слишком много. Когда я вспоминаю, что TcpMaxDataRetransmissions до 6 или 7 решал нашу проблему в подавляющем большинстве случаев.
Tim Farley
16 окт. 2008, в 08:30
Поделиться
Этот сообщение в блоге Майкл Аспенгрен объясняет сообщение об ошибке «Ошибка транспортного уровня произошла при отправке запроса на сервер».
Magnus Lindhe
29 янв. 2010, в 09:02
Поделиться
Чтобы ответить на ваш оригинальный вопрос:
Более элегантный способ обнаружить эту конкретную ошибку без разбора сообщения об ошибке — проверить свойство Number SqlException.
(Это фактически возвращает номер ошибки из первого SqlError в коллекции Errors, но в вашем случае транспортная ошибка должна быть единственной в коллекции.)
Daniel Fortunov
01 окт. 2008, в 06:20
Поделиться
использовать Enterprise Services с компонентами транзакции
Jon Black
23 июль 2010, в 16:03
Поделиться
Я видел это в моей собственной среде несколько раз. Клиентское приложение в этом случае устанавливается на многих машинах. Некоторые из этих машин, как оказалось, являются ноутбуками, которые люди оставляют приложение открытым, отключая его, а затем снова подключая его и пытаясь использовать. Это приведет к ошибке, о которой вы упомянули.
Моей первой точкой было бы посмотреть на сеть и убедиться, что серверы не подключены к DHCP и не обновляют IP-адреса, вызывающие эту ошибку. Если это не так, вам нужно начать трафик через журналы событий, которые ищут другие связанные с сетью.
К сожалению, как указано выше, сетевая ошибка. Главное, что вы можете сделать, это просто следить за соединениями с помощью инструмента, такого как netmon, и работать оттуда.
Удачи.
Dale Wright
31 окт. 2008, в 07:31
Поделиться
Я просто хотел опубликовать исправление, которое работало для нашей компании на новом программном обеспечении, которое мы установили. Мы получили следующую ошибку с первого дня в файле журнала клиента: серверу не удалось обработать запрос. — > При получении результатов с сервера произошла ошибка транспортного уровня. (поставщик: поставщик TCP, ошибка: 0 — период таймаута семафора истек.) — > Срок таймаута семафора истек.
Что было полностью исправлено, проблема заключалась в создании агрегата ссылок (LAG) на нашем коммутаторе. Наш сервер Dell FX1 имеет избыточные линии волокон, выходящие из его задней части. Мы не понимали, что переключатель, к которому они подключены, необходим для настройки LAG на этих двух портах. Подробнее здесь: https://docs.meraki.com/display/MS/Switch+Ports#SwitchPorts-LinkAggregation
J. J.
03 дек. 2015, в 18:01
Поделиться
Сегодня утром в SSMS я столкнулся с транспортной ошибкой при подключении к SQL 2008 R2 Express.
Я пытался импортировать CSV с rn. Я закодировал свой ограничитель строки для 0x0d0x0a. Когда я изменил его на 0x0a, ошибка остановилась. Я могу изменить его взад и вперед и наблюдать, как это происходит/не происходит.
BULK INSERT #t1 FROM 'C:123Import123.csv' WITH
( FIRSTROW = 1, FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0d0x0a' )
Я подозреваю, что я не пишу свой ограничитель строк правильно, потому что SQL анализирует один символ за раз, пока я пытаюсь передать два символа.
Во всяком случае, этой ошибке сейчас 4 года, но она может предоставить немного информации для следующего пользователя.
Phillip Deneka
13 март 2014, в 20:37
Поделиться
Насколько я могу судить, класс 20 — это уровень транспорта.
Joshua
19 авг. 2010, в 18:11
Поделиться
У меня была такая же проблема, хотя это было с запросами на обслуживание SQL DB.
Это то, что у меня было в журнале ошибок службы:
System.Data.SqlClient.SqlException: при отправке запроса на сервер произошла ошибка транспортного уровня. (поставщик: поставщик TCP, ошибка: 0 — существующее соединение было принудительно закрыто удаленным хостом.)
У меня есть набор тестов С#, который проверяет службу. Служба и БД были на внешних серверах, поэтому я думал, что это может быть проблемой. Поэтому я развернул службу и базу данных локально безрезультатно. Вопрос продолжился. Набор тестов не является даже серьезным испытанием на производительность, поэтому я понятия не имел, что происходит. Один и тот же тест терпел неудачу каждый раз, но когда я отключил этот тест, другой будет терпеть неудачу непрерывно.
Я пробовал другие методы, предлагаемые в Интернете, которые тоже не работали:
- Увеличьте значения реестра TcpMaxDataRetransmissions и TcpMaxConnectRetransmissions.
- Отключите параметр «Общая память» в диспетчере конфигурации SQL Server в разделе «Клиентские протоколы» и выполните сортировку TCP/IP до 1-го списка.
- Это может произойти, если вы проверяете масштабируемость с большим количеством попыток подключения к клиенту. Чтобы устранить эту проблему, используйте утилиту regedit.exe, чтобы добавить новое значение DWORD с именем SynAttackProtect в раздел реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersсо значениями данных 00000000.
Моим последним прибежищем было использовать старость, говорящую «Попробуй и попробуй еще раз». Поэтому у меня есть вложенные утверждения try-catch, чтобы убедиться, что если TCP/IP-соединение потеряно в нижнем протоколе связи, он просто не сдаётся, а пытается снова. Теперь это работает для меня, однако это не очень изящное решение.
Martin
23 июль 2010, в 17:00
Поделиться
У меня была та же проблема. Я спросил своих друзей-друзей, и все сказали, что люди ответили здесь: это связь между компьютером и сервером базы данных. В моем случае это был мой интернет-провайдер, или там был маршрутизатор. После обновления маршрутизатора проблема исчезла. Но есть ли у вас какие-либо другие отказы от подключения к Интернету с вашего компьютера или сервера? У меня был…
Jesper Blad Jensen
01 окт. 2008, в 07:51
Поделиться
Я использую уровень надежности вокруг своих команд БД (абстрагировался в interforme репозитория). В основном это просто код, который перехватывает любое ожидаемое исключение (исключение DbException, а также InvalidOperationException, которое, как правило, возникает из-за проблем с подключением), регистрирует его, фиксирует статистику и снова пытается повторить все.
С учетом этого уровня надежности службе удалось изящно выдержать стресс-тестирование (постоянные блокировки, сетевые сбои и т.д.). Производство гораздо менее враждебно, чем это.
PS: Здесь больше об этом (наряду с простым способом определения надежности с помощью DSL перехвата)
Rinat Abdullin
01 окт. 2008, в 05:18
Поделиться
Ещё вопросы
- 1Многоуровневый список в документе Asopse
- 1Как загрузить данные Android на удаленный сервер (база данных)?
- 0QT: Нарисуйте топор ^ 2 + bx + c, используя qcustomplot
- 0MySQL запрос: обновление внешнего ключа с уникальным идентификатором
- 1Microsoft рекламный SDK для Windows Phone 8 (XAML)
- 0Как изменить порядок внутри углового контроллера? Не используете orderBy в разметке?
- 1как получить только активные звонки от PhoneStateListener
- 0Модульный тест AngularJS Jasmine с httpBackend — переменная rootScope не определена
- 0Как правильно инициализировать среду XenForo и создать пользователя?
- 0CSS: абзац в div должен отображаться в той же строке, что и текст div
- 0Как получить большую фотографию в Instagram
- 1Измените ширину при загрузке и сохраняйте пропорцию высоты пропорциональной
- 1Облачная функция, которая регистрирует текущие секунды в базе данных реального времени Firebase
- 1Как методы внутри класса обращаются к константным переменным класса?
- 1Несоответствие типов данных в выражении критериев при работе с БД Query Access
- 1Как выделить поле в отчете rdlc, если оно было изменено по сравнению с предыдущей строкой?
- 1обнаружение объекта (параллельные линии), где часть закрыта
- 0Время ожидания сценария MVC 2 и jquery xhr.responseText пусто
- 1добавление целых чисел из строки
- 0Передача Promise в качестве параметра не вызывает то или не вызывает обратные вызовы
- 1Отдельная логика и рендеринг потоков?
- 0Ошибка подтверждения с GetDC () (с использованием mfc)
- 0Как вывести данные в шаблон angularjs из службы с несколькими источниками данных
- 0Уплотнить несколько вложенных операторов выбора
- 1MongoDB — вставка сингла работает нормально, но массив — нет
- 1Как я могу установить максимальную высоту на ListView?
- 0Разбор строки массива массива строк обратно в массив
- 0привязать событие делегата к элементу при загрузке
- 0Проблемы с сервером WAMP после установки OSGeo4W
- 0c ++ боковые стороны существующего массива C
- 0mysql, возвращает только результаты больше 10000
- 0Как сделать массив с помощью angularjs?
- 0Переменная, объявленная взаимозаменяемо, имеет тот же шаблон адреса памяти
- 0Avg в sql добавляет нули после числа
- 0Невозможно NG-Repeat массив из данных AngularJS (League of Legends)
- 0Выберите все идентификаторы в одной таблице, которые соответствуют как минимум столько же идентификаторов в другой таблице
- 0Создайте несколько перетаскиваемых прямоугольников в элементе canvas html5
- 0Как сделать скользящие div в одной строке?
- 1Преобразовать данные буферизованного файла в объект Json: express-fileupload
- 0Функция запуска AngularJS после загрузки области
- 0Как получить объект данных из тега в IE8
- 0добавить диаграмму с помощью highcharts в angular с помощью директивы highcharts-ng
- 1Не удается сохранить дату календаря в базе данных в Java
- 0Проблема с отображением графика C3 в угловой структуре материала
- 0Бинарная совместимость (с использованием C ++ 11) в старых версиях дистрибутива
- 0Когда элемент html считается пустым? Как это влияет на маржу?
- 0Ошибка обновления при добавлении двузначного целого числа mysql
- 1Теорема о разделяющей трудности трудности