2016-10-12 2 views
3

Я получаю эту ошибку, из-за которой мое приложение перестает работать. Timeout expired. Период ожидания, прошедший до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула был достигнут.Возможно утечка соединения. Причина. Истекло время ожидания. Прошел период ожидания до получения соединения из пула?

Однако я еще не достиг своего пула соединений max. У меня есть RDS, и на моей странице мониторинга я обнаружил, что число подключений было 33 на момент возникновения этой ошибки, а мой max один по умолчанию.

Итак, мне было интересно, что это может быть связано с утечкой в ​​моей связи.

Это DBLayer класс, который я использую для связи с базой данных.

public static DataTable GetDataTable(SqlCommand command, IsolationLevel isolationLevel = IsolationLevel.ReadUncommitted) 
{ 
    using (new LoggingStopwatch("Executing SQL " + command.CommandText, command.Parameters)) 
    { 
     using (var connection = new SqlConnection(connectionString)) 
     using (var dataAdapter = new SqlDataAdapter(command)) 
     { 
      command.Connection = connection; 
      command.CommandTimeout = ShopexConfiguration.SqlTimeout; 
      connection.Open(); 
      var transaction = connection.BeginTransaction(isolationLevel); 
      command.Transaction = transaction; 
      try 
      { 
       var result = new DataTable(); 
       dataAdapter.Fill(result); 
       transaction.Commit(); 
       return result; 
      } 
      catch 
      { 
       try 
       { 
        transaction.Rollback(); 
       } 
       catch (Exception) 
       { 
        // 
        // This catch block will handle any errors that may have occurred 
        // on the server that would cause the rollback to fail, such as 
        // a closed connection. 
       } 
       throw; 
      } 
     } 
    } 
} 

Мне просто интересно, это приведет к утечке соединения?

Я видел этот блог:

https://blogs.msdn.microsoft.com/spike/2008/08/25/timeout-expired-the-timeout-period-elapsed-prior-to-obtaining-a-connection-from-the-pool/

любая помощь?

+0

Это может быть длинный снимок, но существует ли ограничение на количество открытых подключений на пользователя * на сервере *? –

ответ

1

Вы уверены, что ваш запрос не достигнет таймаута выполнения? SqlConnection.ConnectionTimeout имеют значение по умолчанию 15 секунд

Также у вас есть какие-то значения тайм-аута соединения в вашем формате ConnectionString является: "....; Connection Timeout = 10 ..."

+0

Нет, это не время, я получил тайм-аут isse раньше, но моя заявка была в порядке. Когда я получил это исключение, даже elmah не смог зарегистрировать ошибку, мне пришлось использовать новую реликвию, чтобы получить детали ошибки. – user123456

1

Я думаю, что вы должно закрыть соединение в вашем finally заявления, как показано ниже:

public static DataTable GetDataTable(SqlCommand command, IsolationLevel isolationLevel = IsolationLevel.ReadUncommitted) 
{ 
    using (new LoggingStopwatch("Executing SQL " + command.CommandText, command.Parameters)) 
    { 
     using (var connection = new SqlConnection(connectionString)) 
     using (var dataAdapter = new SqlDataAdapter(command)) 
     { 
      command.Connection = connection; 
      command.CommandTimeout = ShopexConfiguration.SqlTimeout; 
      connection.Open(); 
      var transaction = connection.BeginTransaction(isolationLevel); 
      command.Transaction = transaction; 
      try 
      { 
       var result = new DataTable(); 
       dataAdapter.Fill(result); 
       transaction.Commit(); 
       return result; 
      } 
      catch 
      { 
       try 
       { 
        transaction.Rollback(); 
       } 
       catch (Exception) 
       { 
        // 
        // This catch block will handle any errors that may have occurred 
        // on the server that would cause the rollback to fail, such as 
        // a closed connection. 
       } 
       finally { connection.Close(); } 
       throw; 
      } 
     } 
    } 
} 

Может быть, это решает проблему, потому что вы транзакция отката на предыдущую версию в уловах заявлении, не закрывая ваш адрес подключение xisting вы также можете использовать ниже условие, прежде чем вы собираетесь открыть SQL соединения:

if (connection.State == ConnectionState.Closed) { 
     // Open your connection here 
     connection.Open(); 
    } 
// Do your logic here 

Надеется, что это будет поможет вам.

спасибо

+0

@sunul Kamur Спасибо за ур ответ, я думал об этом. Но я думал, что транзакция.Rolleback должен закрыть соединение для меня – user123456

+0

Пожалуйста, отметьте и отпустите мое решение, если оно вам поможет, спасибо :) –

Смежные вопросы

 Смежные вопросы