У більшості випадків проблеми об’єднання підключень пов'язані з "витоками з'єднання". Ваша програма, ймовірно, не закриває підключення до бази даних правильно та послідовно. Якщо ви залишаєте з'єднання відкритими, вони залишаються заблокованими, поки збирач сміття .NET не закриє їх для вас, викликаючи їх Finalize()
метод.
Ви хочете переконатися, що ви дійсно закриваєте зв’язок . Наприклад, наступний код призведе до витоку з'єднання, якщо код між .Open
і Close
видає виняток:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Правильним було б таке:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
або
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Коли ваша функція повертає з'єднання з методу класу, переконайтесь, що ви кешуєте його локально та називаєте його Close
метод. Ви підключите з'єднання за допомогою цього коду, наприклад:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
З'єднання, повернене з першого дзвінка на getConnection()
, не закривається. Замість того, щоб закрити зв’язок, ця лінія створює нову та намагається її закрити.
Якщо ви користуєтесь SqlDataReader
або a OleDbDataReader
, закрийте їх. Навіть незважаючи на те, що закриття з’єднання саме по собі здається виправданням, докладіть додаткових зусиль, щоб закрити об'єкти зчитувача даних, коли ви їх використовуєте.
Ця стаття " Чому переповнення басейну підключення? " З журналу MSDN / SQL пояснює багато деталей та пропонує деякі стратегії налагодження:
- Виконати
sp_who
або sp_who2
. Ці системні збережені процедури повертають інформацію із sysprocesses
системної таблиці, яка показує стан та інформацію про всі робочі процеси. Як правило, ви побачите один ідентифікатор серверного процесу (SPID) за з'єднання. Якщо ви назвали своє з'єднання, використовуючи аргумент Ім'я програми в рядку з'єднання, ваші робочі з'єднання легко знайти.
- Використовуйте Профілер SQL Server із
TSQL_Replay
шаблоном SQLProfiler для відстеження відкритих з'єднань. Якщо ви знайомі з Profiler, цей спосіб простіше, ніж опитування, використовуючи sp_who.
- Використовуйте Монітор ефективності для контролю пулів та з'єднань. Я обговорюю цей метод за мить.
- Монітор лічильників продуктивності в коді. Ви можете стежити за станом вашого пулу з'єднань та кількістю встановлених з'єднань, використовуючи підпрограми для вилучення лічильників або за допомогою нових елементів керування .NET PerformanceCounter.