Я использую SQL Server 2008 R2 с пакетом обновления 1 (SP1) на компьютере под управлением Windows Server 2008. У меня есть скрипт .NET, запущенный из Visual Studio 2010, который выполняет следующие действия:
- Достигает в базу данных
- Вносит изменения
- Итерации
Общее количество повторений 150, но оно останавливается на 100 соединениях, и я не могу понять, почему. Я мог бы настроить свой сценарий так, чтобы он использовал только один поток, но я бы предпочел знать, где мне не хватает максимальной настройки соединения, так как это будет более полезно узнать для дальнейшего использования.
Вот где я проверил до сих пор:
- Строка SQL-соединения в Visual Studio 2010 (установлена на 1000)
- Свойства соединения экземпляра базы данных SSMS (для него установлено 0 [бесконечность] пользовательских соединений)
- Погуглил некоторую информацию о Server 2008, похоже, он может обрабатывать более 100 соединений
- Пошагово просматривал мой код,
SP_WHO2
который дает больше информации о логических соединениях, видя, что число соединений начинается с 52, а ошибки сценария с ошибкой «Максимальное количество соединений в пуле достигнуто» при 152 логических соединениях. - Изменена строка подключения для использования
Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Я не уверен, где еще можно проверить, я знаю, что у меня здесь много движущихся частей, но у меня возникает ощущение, что я просто где-то пропускаю настройку максимального пула.
sql-server
Шон Лонг
источник
источник
System.Data.SqlClient
умолчанию 100, поэтому вы видите исчерпание пула подключений).Ответы:
SQL Server разрешает максимум 32767 подключений по умолчанию. Это может быть изменено с помощью
sp_configure
. Чтобы просмотреть текущую конфигурацию для этого параметра, используйте следующий запрос:По умолчанию вы должны увидеть максимум 32767,
value_in_use
равный 0 (используйте настройки по умолчанию). Если это было изменено, вы можете перенастроить SQL Server для использования других значений, как описано в ссылке.Вам также следует проверить, сколько соединений на самом деле установлено, поскольку за пределами вашего приложения может быть больше активности (или ваше приложение устанавливает больше соединений, чем вы думаете). Вы можете посмотреть на General Statistics -> Logical Connections в perfmon или запросить значения в
sys.dm_os_performance_counters
(cntr_value покажет текущую точку во времени):источник
В строке подключения укажите
max pool size=<your desired max pool size>
. Другими словами, если вы хотите изменить максимальный размер пула на значение 500, строка подключения может выглядеть следующим образом:Очевидно, я так много думаю о других ваших параметрах, но это должно дать вам хорошее представление о том, как действовать. Пул соединений - это принудительное применение на стороне клиента. Это клиент, который должен будет указать эту настройку максимального размера пула через строку подключения.
Кроме того, убедитесь, что вы правильно закрываете или утилизируете свои соединения, в противном случае вы будете связывать соединения. Как то так (C #):
using
Блок (в C #) вызываетIDisposable.Dispose()
после завершения. Вы также можете реализоватьSqlConnection.Dispose()
илиSqlConnection.Close()
вfinally
блокеtry/catch/finally
блока.Ссылка: документация MSDN для свойства SqlConnection.ConnectionString
источник
Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
SqlConnection.ConnectionString
для конкретной операции. Это был бы самый простой способ. Еслиmax pool size
нет, значит, 100