Из MSDN (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx):
Когда запрашивается объект SqlConnection, он получается из пула, если доступно используемое соединение. Для использования соединение должно быть неиспользованным, иметь соответствующий контекст транзакции или быть не связанным с каким-либо контекстом транзакции и иметь действительную ссылку на сервер.
Диспетчер соединений удовлетворяет запросы на соединения, перераспределяя соединения, когда они возвращаются обратно в пул. Если достигнут максимальный размер пула и доступное соединение недоступно, запрос помещается в очередь. Затем диспетчер пытается восстановить любые подключения до истечения времени ожидания (по умолчанию 15 секунд). Если диспетчер не может удовлетворить запрос до истечения времени ожидания соединения, выдается исключение .
Перевод: Проверьте контексты транзакции ... если у вас размер пула 10 подключений, а в разных транзакциях создано 10 подключений, вы облажались.
Обратите внимание, что разорванное соединение может быть обнаружено только после попытки установить связь с сервером . Если обнаружено соединение, которое больше не подключено к серверу, оно помечается как недействительное. Недействительные соединения удаляются из пула соединений только тогда, когда они закрыты или восстановлены.
Если соединение с пропавшим сервером существует, это соединение можно извлечь из пула, даже если диспетчер соединений не обнаружил разорванное соединение и пометил его как недействительное. Это так, потому что накладные расходы на проверку того, что соединение все еще действует, устранят преимущества наличия пула, вызвав еще одну обратную передачу на сервер. Когда это происходит, при первой попытке использовать соединение обнаружит, что соединение разорвано, и выдается исключение .
Перевод: Неужели нельзя полагаться на соединение, которое нужно подключить? Статья не объясняет, как справиться с этим ...
Вы можете иногда пытаться очистить пул вручную, используя ClearAllPools и ClearPool, но для меня это звучит как пластырь, заставляет меня съеживаться.
В статье также обсуждаются контексты безопасности:
После активации роли приложения SQL Server путем вызова системной хранимой процедуры sp_setapprole, контекст безопасности этого соединения не может быть сброшен. Однако если пул включен, соединение возвращается в пул, и возникает ошибка при повторном использовании пула.
Я начинаю задумываться, почему я использую пул соединений ...
И наконец:
Фрагментация пула благодаря встроенной защите
Соединения объединяются в соответствии со строкой соединения и идентификацией пользователя. Поэтому, если вы используете обычную проверку подлинности или проверку подлинности Windows на веб-сайте и вход в систему с интегрированной защитой, вы получаете один пул на пользователя. Хотя это повышает производительность последующих запросов к базе данных для одного пользователя, этот пользователь не может использовать преимущества подключений других пользователей. Это также приводит как минимум к одному соединению на пользователя с сервером базы данных.
Так что, если вы используете встроенную защиту в веб-приложении, вы можете пополнить свой пул соединений, если у вас достаточно пользователей.
Не зная больше подробностей о вашем приложении, трудно увеличить масштаб того, что может сбить вас с толку, но, надеюсь, это даст вам некоторые идеи, где искать.
НТН