Я бег многопоточной операции, которая извлекает данные из базы данных SQL Server с помощью SqlConnection
и Parallel.ForEach()
и происходят следующее:ADO.net не закрывает TCP соединения достаточно быстро
- Я обернуть
SqlConnection
вusing
, чтобы соединение было правильно настроено. - Моего процесс последовательно бросает
SqlException
обернутые вAggregateException
после успешного запуска в течение некоторого времени («Произошла ошибка сети связанного или экземпляра конкретного при установлении соединения с SQL Server ..») - Я обнаружил, что это происходит около 2^14 (16384) звонков в базу данных (всего, по всем потокам).
- Я запустил perfmon, и я вижу, что это также количество TCP-соединений, которые открываются прямо около времени, когда генерируется исключение (счетчик «Установленные соединения»).
- Я уверен, что в моем коде отсутствует утечка связи - там очень мало мест, где я запрашиваю базу данных, и все они правильно распоряжаются соединением (на самом деле, нет другого шаблона, который я использую для запроса в другую базу данных чем ваниль
using(...)
) - Я отключил пул соединений, и происходит такое же поведение.
- Как ни странно, если я удалю индекс в SQL Server, который быстро выполнит мои запросы, операция завершится успешно (хотя и очень медленно) - исключение не выбрасывается. Я заметил, что # из Connections Established линейно растет примерно до 13K, а затем стабилизируется в течение некоторого времени, а затем есть некоторые периоды с линейным спадом, все время операции выполняется.
- Мое заключение состоит в том, что с установленным индексом .net обрабатывает данные быстрее, чем может закрыть соединения и, в конечном итоге, попадает на какой-то порог сокета ОС или .NET. Без индекса .NET все еще поддерживает слишком много соединений, но у него есть время, чтобы закрыть их достаточно, чтобы порог максимального открытого сокета не попал.
Я в затруднении, как проинструктировать .NET о том, чтобы закрыть эти соединения. Я думал, что это произошло автоматически, когда установлен SqlConnection
.
Что особенно странно в том, что когда пул соединений активен с использованием настройки по умолчанию (100 подключений), этот ADO отлично работает с расширением TCP-соединений - как будто объединенные соединения просто заброшены?!?! – SFun28