Закрывается ли мой объект .Net SqlConnection сам по себе

#.net #sqlconnection

#.net #sqlconnection

Вопрос:

У нас есть простой циклический процесс, который выполняет некоторые действия с некоторыми потоками данных.

При фиксации изменений новая строка и объект SqlConnection передаются методу, который обрабатывает изменение или добавление строки.

Процесс выполняется 5 раз из 10, все нормально. SqlConnection открывается в начале цикла и закрывается после цикла, однако иногда он действительно закрывается во время цикла. В коде нет вызова close () в любой момент цикла.

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

Приветствия

Для справки код выглядит следующим образом

 connection.Open();

foreach(DataRow row in rows)
{
  if(rubbish)
{
   //make some changes and save
   DatabaseConnector.Save(sqlStringToExecute, connection);
}
}

connection.Close();
  

Комментарии:

1. Можете ли вы показать свой код? Это сделает ваш вопрос более понятным.

2. Может быть, вам следует использовать несколько подключений для каждой операции?

3. никогда не выполняйте код, подобный приведенному выше, если что-то произойдет и возникнет исключение, ваше соединение не будет закрыто, где вы его объявляете, используйте оператор Using, поэтому в любом случае соединение будет закрыто и удалено при выходе из области видимости.

4. Действительно ли соединение закрылось (что является исключением или сообщением об ошибке)? Может ли быть так, что время ожидания (распределенной) транзакции истекает внизу? Возможно, время ожидания оператора.

Ответ №1:

Соединение не закроется само по себе, нет. Основное время закрытия соединения было бы:

  • удаление (например, с помощью using инструкции)
  • явный вызов Close()
  • выполняется команда с CommandBehaviour.CloseConnection поведением
  • своего рода сборка мусора (хотя на самом деле это немного другое)
  • сервер перестает быть доступным

Первое вполне возможно, если вы действительно получаете исключение (возможно, тайм-аут или взаимоблокировку), проходите через using блок (удаляя его) и, возможно, проглатываете исключение.

Третье вполне возможно в благонамеренном коде.

Для расследования вы могли бы подписаться на StateChange событие и добавить точку останова в обработчике; затем пройдите назад по трассировке стека, и вы точно узнаете, кто его закрывает и почему. Если вы используете соединение, выходящее за рамки этого кода, не забудьте также отказаться от подписки.

Комментарии:

1. Это действительно так просто, как в примере выше. Соединение передается методу, который выполняет sql и завершает работу. Иногда во время цикла это закрытое соединение, запустите приложение снова, и оно работает нормально. Трассировка стека и т.д. И после стека вызовов не отображается ничего, чего вы не могли бы видеть выше. Это, конечно, странно.

2. @Robert — затем подключите StateChange, чтобы выяснить, почему

3. вы имеете в виду подключение к событию statechanged соединения?

4. @robert да, это то, что я имею в виду

5. Хорошо, я сделаю это, и следующий запуск завтра, так что я доведу это до конца и посмотрю, что смогу выяснить.