Максимальный пул подключений ограничен 100

27

Я использую 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

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

Шон Лонг
источник
1
Можете ли вы опубликовать строку подключения? Пожалуйста, посмотрите мой ответ. Это должно быть вашим решением (это значение будет указано в строке подключения. По System.Data.SqlClientумолчанию 100, поэтому вы видите исчерпание пула подключений).
Томас Стрингер

Ответы:

24

SQL Server разрешает максимум 32767 подключений по умолчанию. Это может быть изменено с помощью sp_configure. Чтобы просмотреть текущую конфигурацию для этого параметра, используйте следующий запрос:

select * from sys.configurations
where name ='user connections'

По умолчанию вы должны увидеть максимум 32767, value_in_useравный 0 (используйте настройки по умолчанию). Если это было изменено, вы можете перенастроить SQL Server для использования других значений, как описано в ссылке.

Вам также следует проверить, сколько соединений на самом деле установлено, поскольку за пределами вашего приложения может быть больше активности (или ваше приложение устанавливает больше соединений, чем вы думаете). Вы можете посмотреть на General Statistics -> Logical Connections в perfmon или запросить значения в sys.dm_os_performance_counters(cntr_value покажет текущую точку во времени):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
Майк Фал
источник
Да, я уже проверил пользовательские соединения (это первое, на что я пошел, и его проще всего найти как в пользовательском интерфейсе, так и в документации Microsoft. Я также прошелся по своему коду и следил за количеством логических соединений через SSMS: используя SP_WHO2, который дает приличное количество информации о логических соединениях. На холостом ходу мой сервер имеет 51 соединение. Когда сценарий завершается неудачей, он создает еще 100 соединений. Вот как я дошел до того места, где я сейчас нахожусь
Шон Лонг
Я разъяснил свой вопрос немного больше с шагами, которые я сделал. Это может быть совсем не параметр в SQL, поэтому я начал изучать настройки Windows и Visual Studio.
Шон Лонг
1
Если вы проверили все это, и это все равно не удается при 100 соединениях, ответ лежит за пределами настроек базы данных. К вашему сведению, эти 51 соединение - это все системные процессы (+1 для вас).
Майк Фал
Просто, чтобы обеспечить некоторое завершение, последний комментарий оказался правильным. Я внимательно посмотрел на то, почему создавались эти 100 соединений, и обнаружил утечку в коде. После исправления это работает нормально. Приведенная выше информация все еще действительно полезна, и я надеюсь, что другие найдут ее полезной.
Шон Лонг
25

В строке подключения укажите max pool size=<your desired max pool size>. Другими словами, если вы хотите изменить максимальный размер пула на значение 500, строка подключения может выглядеть следующим образом:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

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

Кроме того, убедитесь, что вы правильно закрываете или утилизируете свои соединения, в противном случае вы будете связывать соединения. Как то так (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

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
Шон Лонг
3
Это ваша строка подключения везде ? Причина, по которой я спрашиваю, состоит в том, что разные строки подключения будут разными пулами соединений.
Томас Стрингер,
Это очень, очень хороший вопрос. До сих пор я проверял 3 строки подключения, но все они настаивают на максимальном пуле. Я посмотрю, смогу ли я найти любую другую строку, которая могла бы вызвать это.
Шон Лонг
Если вы просто отладите выполнение, вы сможете посмотреть, какое значение времени выполнения SqlConnection.ConnectionStringдля конкретной операции. Это был бы самый простой способ. Если max pool sizeнет, значит, 100
Томас Стрингер
1
Это должно быть помечено как принятый ответ, так как оно действительно отвечает на OP правильно. Он упоминает как параметр «Максимальный размер пула» строки клиента, так и необходимость закрывать / удалять соединения.
Адам Кэвнесс