Закрывается ли мой объект .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();

person Robert    schedule 25.05.2011    source источник
comment
Вы можете показать свой код? Это прояснит ваш вопрос.   -  person Darin Dimitrov    schedule 25.05.2011
comment
Может, стоит использовать несколько подключений для каждой операции?   -  person cnd    schedule 25.05.2011
comment
никогда не выполняйте код, подобный приведенному выше, если что-то произойдет и возникнет исключение, ваше соединение не будет закрыто, где вы его объявляете, используйте оператор Using, чтобы в любом случае соединение было закрыто и удалено при выходе из области видимости.   -  person Davide Piras    schedule 25.05.2011
comment
Действительно ли соединение закрылось (в чем заключается исключение или сообщение об ошибке)? Может ли быть так, что (распределенная) транзакция истекает по таймауту? Возможно, истекло время ожидания.   -  person Christian.K    schedule 25.05.2011


Ответы (1)


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

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

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

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

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

person Marc Gravell    schedule 25.05.2011
comment
Это действительно так просто, как в приведенном выше примере. Соединение передается методу, который выполняет sql и завершает работу. Иногда во время цикла это закрытое соединение, запустите приложение еще раз, и оно работает нормально. Трассировка стека и т. Д., И следование стеку вызовов не показывает ничего, что вы не видели выше. Это точно странно. - person Robert; 25.05.2011
comment
@Robert - затем подключите StateChange, чтобы узнать, почему - person Marc Gravell; 25.05.2011
comment
вы имеете в виду привязку к событию statechanged соединения? - person Robert; 25.05.2011
comment
@robert да, это то, что я имею в виду - person Marc Gravell; 25.05.2011
comment
Хорошо, я сделаю это, и следующий запуск будет завтра, так что я прослежу его и посмотрю, что я смогу узнать. - person Robert; 25.05.2011
comment
Он закрывается сам по себе без какой-либо причины, которую я могу установить, поэтому я просто добавил, что если соединение закрыто, откройте его, и он подсчитывает, сколько раз это происходит, что варьируется от нуля до примерно 12 раз при каждом запуске. - person Robert; 08.06.2011
comment
@Robert, вы подписались на событие и регистрировали трассировку стека, когда оно закрывается? - person Marc Gravell; 08.06.2011
comment
Да, в этом нет ничего необычного, и это совершенно случайно. Я знаю, что когда вы «открываете» соединение, оно на самом деле не открывается, мне предоставляется соединение из пула соединений, поэтому я думаю, что это сам сервер что-то делает, чтобы закрыть соединение. - person Robert; 09.06.2011