Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да реша проблем с пула за връзки между ASP.NET и SQL Server?

В повечето случаи проблемите с обединяването на връзки са свързани с течове на връзка . Вашето приложение вероятно не затваря връзките си към базата данни правилно и последователно. Когато оставите връзките отворени, те остават блокирани, докато .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 или OleDbDataReader , затворете ги. Въпреки че самото затваряне на връзката изглежда върши работа, положете допълнителни усилия, за да затворите изрично обектите си за четене на данни, когато ги използвате.

Тази статия „Защо пулът за връзки препълва?“ от MSDN/SQL Magazine обяснява много подробности и предлага някои стратегии за отстраняване на грешки:

  • Изпълнете sp_who или sp_who2 . Тези системни съхранени процедури връщат информация от sysprocesses системна таблица, която показва състоянието и информацията за всички работни процеси. Обикновено ще видите един идентификатор на сървърен процес (SPID) на връзка. Ако сте именували връзката си с помощта на аргумента Application Name в низа на връзката, работните ви връзки ще бъдат лесни за намиране.
  • Използвайте SQL Server Profiler с SQLProfiler TSQL_Replay шаблон за проследяване на отворени връзки. Ако сте запознати с Profiler, този метод е по-лесен от анкетата с помощта на sp_who.
  • Използвайте монитора на производителността, за да наблюдавате пуловете и връзките. Ще обсъдя този метод след малко.
  • Наблюдавайте броячите на производителността в код. Можете да наблюдавате здравето на вашия пул за връзки и броя на установените връзки, като използвате рутинни програми за извличане на броячите или като използвате новите контроли на .NET PerformanceCounter.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вмъкнете данни в SQL Server

  2. Родната библиотека sqljdbc_auth.dll вече е заредена в друг зареждач на класове

  3. Транспониране на редове и колони без агрегат

  4. Как да промените колона от Null на Not Null в таблицата на SQL Server - SQL Server / T-SQL урок, част 52

  5. Не може да се свърже със SQL Server с PHP