Нет доступных соединений в пуле соединений ADO.NET - PullRequest
0 голосов
/ 25 ноября 2010

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

Истекло время ожидания.Время ожидания истекло до получения соединения из пула.Это могло произойти из-за того, что все пулы соединений использовались и был достигнут максимальный размер пула.

Первое, что я попробовал, было убедиться, что все соединения закрыты и удалены.Для этого мы изменили все подключения к базе данных на:

try
{
     oConnection.Open();
     //do something
}    
catch()
{

}
finally
{
     if (oConnection.State != ConnectionState.Closed)
     {
         oConnection.Close();
         oConnection.Dispose();
     }
}

Я использую следующую строку подключения:

server=databaseserver;Database=databasename;User Id=username;Password=password;Max Pool Size=600;Min Pool Size=50;Connection Timeout=180;Pooling=true

В Performance Manager, поставщик данных .NET для SqlServer, я могуобратите внимание, что NumberOfPooledConnections и NumberOfActivePooledConnections всегда ниже максимального размера пула строки подключения, всегда между 60 и 90 соединениями.

Кто-нибудь знает, как это возможно?Я получаю исключение, что в пуле нет соединений, но я вижу, что пул не заполнен.

Моя среда:

  • Windows Server 2003 Enterprise SP2 (со всеми последними исправлениями)
  • IIS 6.0 (с 4 рабочими процессами в веб-саду и пуле приложений каждые 60 минут перезагружаются)
  • SQL Server 2005

Может кто-нибудь помочьмне

Ответы [ 4 ]

5 голосов
/ 25 ноября 2010
using (oConnection) {

   oConnection.Open();

   // Your code here

   // No need to explicitly close or dispose

}
1 голос
/ 25 ноября 2010

Этот кусок кода

if (oConnection.State != ConnectionState.Closed)
{
     oConnection.Close();
     oConnection.Dispose();
}

не удаляет () закрытое соединение. Я не уверен, что это проблема, но это нужно исправить. Jusr использует nconditional Dispose () или блок using() { }.

0 голосов
/ 26 ноября 2010

Во-первых, параметр для максимального числа соединений, разрешенных SQL Server, отличается от параметра ADO.NET для максимально разрешенных соединений в пуле соединений .NET.

Во-вторых, вызов SqlConnection.Close() фактически не закрывает его соединение с SQL Server. Он просто сообщает пулу соединений, что больше нет необходимости держать соединение открытым. Однако пул соединений будет держать его открытым немного дольше, если будет запрошен другой запрос на соединение с той же строкой соединения. Чтобы убедиться в этом, проверьте Монитор активности SQL Server до и после «закрытия» соединения. Вы увидите, что состояние соединения на SQL Server фактически спит.

Что касается ваших исключений по таймауту, я согласен с предложением каждого использовать блок using() { }. Кроме того, если вы используете SqlDataReader, убедитесь, что вы также закрываете его.

0 голосов
/ 25 ноября 2010

Состояние может быть закрыто, но соединение все еще не утилизировано, поэтому вы не утилизируете это соединение, используйте блок использования, как предлагалось ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...