Я столкнулся с неприятной проблемой, которую я изначально считал утечкой соединения, но, похоже, это не так. Второе разделение таково: доступ к данным для этого приложения осуществляется с помощью корпоративных библиотек (v4) от Microsoft. Все вызовы доступа к данным заключены в такие операторы, как
using (DbCommand dbCommand = db.GetStoredProcCommand("sproc"))
{
db.AddInParameter(dbCommand, "MaxReturn", DbType.Int32, MaxReturn);
...more code
}
Теперь индекс этого приложения делает 8 обращений к базе данных, чтобы загрузить все, и я могу поставить приложение на колени, обновив индекс около 15 раз. Кажется, что когда база данных достигает 113 соединений, я получаю эту ошибку. Вот что делает это странным:
Я выполнял подобный код с entlib на сайтах с высоким трафиком, и НИКОГДА не сталкивался с такой проблемой.
Если я прерву все соединения с базой данных и получу, чтобы производственное приложение снова запускалось и работало каждый раз, когда я обновляю приложение, я могу запустить этот SQL
SELECT DB_NAME(dbid) as 'Database Name',
COUNT(dbid) as 'Total Connections'
FROM sys.sysprocesses WITH (nolock)
WHERE dbid > 0
GROUP BY dbid
Я вижу, как количество соединений активно увеличивается с каждым обновлением страницы. Выполнение того же кода на моем локальном компьютере с той же строкой подключения не вызывает этой проблемы. Кроме того, если рабочий сайт не работает, я могу запустить его через Visual Studio и запустить его нормально, и единственное различие между ними заключается в том, что на рабочем сайте включена проверка подлинности Windows, а у моей локальной копии нет. Отключение аутентификации Windows, похоже, не влияет на сервер.
Я не имею ни малейшего понятия, что является причиной этого или почему не удаляются соединения в SQL Server. Объекты EntLib не используют методы .Close () для чего-либо, поэтому я не могу явно закрыть объект.
Есть мысли?
Спасибо!
Редактировать
Ух, я только что заметил, что никогда не публиковал сообщение об ошибке. Oy. Фактическая ошибка соединения: Истекло время ожидания. Время ожидания истекло до получения соединения из пула. Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула.