Максимальний розмір підключення Басейн обмежений 100


27

Я використовую SQL Server 2008 R2 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, тому ви бачите вичерпання пулу з'єднань).
Thomas Stringer

Відповіді:


24

За замовчуванням SQL Server дозволяє максимум 32767 підключень . Це можна змінити, використовуючи sp_configure. Щоб переглянути поточну конфігурацію цього налаштування, використовуйте наступний запит:

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

За замовчуванням ви повинні бачити максимум 32767, що value_in_useдорівнює 0 (використовуйте налаштування за замовчуванням). Якщо це було змінено, ви можете налаштувати SQL Server для використання інших значень, як описано у посиланні.

Ви також повинні переглянути, скільки підключень насправді здійснюється, оскільки може бути більше активності поза вашим додатком (або ваша програма здійснює більше з'єднань, ніж ви думаєте). Ви хочете переглянути загальну статистику -> Логічні з'єднання або в 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 підключенням, відповідь лежить поза налаштуваннями бази даних. FYI, ці 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
Це ваш рядок з'єднання скрізь ? Я запитую причину тому, що різні рядки з'єднання будуть різними пулами з'єднань.
Thomas Stringer

Це дуже-дуже хороше питання. Я перевірив 3 рядки підключення поки що, але всі вони наполягають на високому максимальному пулі. Я побачу, чи зможу я знайти будь-яку іншу рядок, яка могла б її викликати.
Шон Лонг

Якщо ви просто налагоджуєте виконання, ви маєте змогу подивитися, яке значення SqlConnection.ConnectionStringвиконує для конкретної операції. Це було б найпростішим способом. Якщо max pool sizeйого там немає, то це 100.
Thomas Stringer

1
Це слід позначити як прийняту відповідь, оскільки вона фактично відповідає на ОП правильно. Він згадує як параметр "Максимальний розмір пулу" для клієнта, так і необхідність закривати / розпоряджатися з'єднаннями.
Адам Порожня
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.