Каковы последствия не закрытия подключения к базе данных после ошибки? - PullRequest
7 голосов
/ 27 сентября 2008

У меня есть приложение, которое вызывает много головных болей. Это приложение .NET, подключающееся к SQL Server 2005 через веб-сервис. Программа имеет сетку, которая заполняется долго хранимой процедурой, которая подвержена тайм-ауту. В случае, когда истекает время ожидания и генерируется SqlException, отсутствует обработка исключений для закрытия соединения.

Каковы реальные последствия этого состояния? Я думаю, что фреймворк или SQL Server, вероятно, позаботятся об этом так или иначе, но я не уверен.

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

Заключение Я спроектировал этот сбой на сотнях одновременных соединений. Никогда я не мог воспроизвести состояние отказа в среде приложения. Отмеченные лучшие практики отвечают как правильные. Спасибо всем.

Ответы [ 7 ]

5 голосов
/ 27 сентября 2008

Поскольку SqlConnection закрывается при удалении, я обычно использую этот синтаксис

using (SqlConnection conn = new SqlConnection())
{
  // SqlCode here 
}
2 голосов
/ 27 сентября 2008

Есть лимит подключения; если ваше приложение часто дает сбой и не закрывает соединения автоматически, новые запросы на соединение будут отклонены.

Тем не менее, соединения перестают работать через некоторое время, если они не закрыты.

1 голос
/ 27 сентября 2008

Вот почему ключевое слово «использование» так важно при использовании ADO.Net

 using ( SqlConnection conn = new SqlConnection() )
 {
     ...
 }

Это вызывает тип детерминированной сборки мусора для объекта ADO.Net с использованием интерфейса IDispose.

Большая часть кода базы данных использует для этой цели множество вложенных предложений «using».

1 голос
/ 27 сентября 2008

Если приложение перестает работать примерно через час, это может быть вызвано тем, что соединения не были закрыты / удалены.

0 голосов
/ 27 сентября 2008
try
{
    sqlCommandObject.Execute(); // this line will throw a timeout exception
}
finally
{
    sqlConnectionObject.Close(); // this will execute no matter what happens
}
0 голосов
/ 27 сентября 2008

Сборщик мусора в конечном итоге завершит ваш открытый объект соединения, но вы не знаете, когда GC появится в следующий раз. До этого времени у вас могут заканчиваться соединения в вашем пуле, если у вас много трафика или это общий sql-сервер.

Почему бы не разместить его в секции finally вашего блока try / catch?

finally
{
   if (cn != null)
   {
      cn.Dispose();
      cn = null;
   }
}

Это должно быть сделано в методе веб-службы, очевидно.

0 голосов
/ 27 сентября 2008

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

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