Более 100 подключений к серверу SQL Server 2008 в состоянии "сна"

У меня здесь большие проблемы, хорошо на моем сервере.

У меня есть ASP.net web (фреймворк 4.x), запущенный на моем сервере, все транзакции /select/update/insert сделаны с ADO.NET.

Проблема заключается в том, что после некоторого времени использования (несколько обновлений/выбора/вставки) иногда я получал более 100 подключений по статусу "спящий" при проверке соединений на сервере sql с этим запросом:

SELECT 
 spid,
 a.status,
 hostname,  
 program_name,
 cmd,
 cpu,
  physical_io,
  blocked,
  b.name,
  loginame
FROM   
  master.dbo.sysprocesses  a INNER JOIN
  master.dbo.sysdatabases b  ON
    a.dbid = b.dbid where program_name like '%TMS%'
ORDER BY spid 

Я проверяю свой код и закрываю каждый раз, когда подключаюсь, я собираюсь протестировать новый класс, но я боюсь, что проблема не устранена.

Предположим, что объединение пулов, сохраните соединения, чтобы повторно использовать их, но пока я не вижу их, повторно не используйте их всегда.

Любая идея, кроме проверки закрытия всех подключений после их использования?

SOLVED (теперь у меня есть только одно и прекрасное подключение к статусу "спящий" ):

Помимо anwser David Stratton, я хотел бы поделиться этой ссылкой, которая очень хорошо объясняет, как работает пул соединений: http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and.html

Чтобы быть коротким, вам нужно закрыть каждое соединение (объекты соединения sql), чтобы пул соединений мог повторно использовать соединение и использовать одну и ту же строку connectinos, чтобы это было настоятельно рекомендовано использовать в одном из webConfig.

Будьте осторожны с dataReaders, к которым вы должны закрыть его подключение (вот что заставляет меня злиться пока).

Ответ 1

Похоже, что это объединение пулов.

Отсюда: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

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

Чтобы убедиться, что вы не создаете ненужные пулы, убедитесь, что всякая строка соединения используется при каждом подключении - сохраните ее в файле .config.

Вы также можете уменьшить максимальный размер пула, если хотите.

Собственно, я бы рекомендовал просто прочитать всю статью, связанную с выше. Он говорит об очистке пулов и дает вам рекомендации по правильному использованию пула.

Изменить - добавлено на следующий день

Пулы на вашем сервере существуют из-за того, как работает пул соединений. По документации, связанной выше:

Пул соединений удаляет соединение из пула после того, как он долгое время простаивали, или если пул обнаруживает, что соединение с сервером было отключено. Обратите внимание, что отрезанный соединение может быть обнаружено только после попытки связаться с сервер. Если обнаружено соединение, которое больше не связано с сервер, он помечен как недействительный. Недействительные соединения удаляются из пула соединений только тогда, когда они закрыты или возвращены.

Это означает, что сам сервер очистит эти пулы в конце концов, если они останутся неиспользованными. Если они НЕ очищены, то это означает, что сервер считает, что соединения все еще используются, и подвешивает их к повышению производительности.

Другими словами, я бы не стал беспокоиться об этом, если вы не видите проблему. Пул соединений происходит точно так, как должно быть.

Если вы действительно хотите очистить пулы, опять же, за документацию:

Очистка пула

ADO.NET 2.0 представил два новых метода: очистите пул: ClearAllPools и ClearPool. ClearAllPools очищает пулы соединений для данного поставщика, а ClearPool очищает пул соединений, связанный с определенным соединением. Если есть соединения, используемые во время вызова, они обозначен соответствующим образом. Когда они закрыты, вместо этого они отбрасываются возврата в пул.

Однако, если вы хотите настроить объединение, строка Connection может быть изменена. См. Эту страницу и найдите слово "пул":

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

Или вы можете заручиться администратором базы данных, чтобы помочь и установить объединение на уровне сервера. Это вне темы здесь, но ServerFault.com может заставить людей помочь там.