Более 100 подключений к sql server 2008 в «спящем» состоянии - PullRequest
11 голосов
/ 27 сентября 2011

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

У меня на сервере работает ASP .net web (framework 4.x), все транзакции / выбор / обновление / вставка выполняются с помощью 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 

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

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

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

решено (теперь у меня только одно и красивое соединение в «спящем» состоянии):

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

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

Будьте осторожны с читателями данных, с которыми вам следует закрывать соединение (это то, что меня бесит).

1 Ответ

17 голосов
/ 27 сентября 2011

Похоже, что это пул соединений.

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

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

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

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

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

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

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

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

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

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

Если вы ДЕЙСТВИТЕЛЬНО хотите очистить пулы, снова, согласно документации:

Очистка пула

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

Однако, если вы хотите настроить пул, строку подключения можно изменить.См. Эту страницу и выполните поиск по слову «пул»:

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

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

...