У меня есть устаревшие коды (формы VB6), которые следуют шаблону плохого дизайна. Он подключается к базе данных в конструкторе и закрывает ее в деструкторе класса (т. Е. Class_Terminate для VB6).
Существуют сотни классов, которые следуют этому шаблону (или используют классы, которые следуют этому шаблону).
Мы сейчас переносим его на .NET и столкнулись с проблемой. Поскольку при переносе ADO в ADO.NET (это жесткое требование) закрытие соединения ADO.NET в методе Finalize вызовет исключение.
(Более подробное объяснение: Исключение: InvalidOperationException: дескриптор не инициализирован. Наблюдайте за объектом соединения, состояние все еще открыто. Из предыдущих вопросов в StackOverflow люди предлагали открывать и закрывать соединение сразу после использования, и не не держать соединение открытым в течение всего срока службы объекта класса.)
Я искал и обнаружил, что в .NET только неуправляемые ресурсы будут освобождены в Finalize. Такие объекты, как DBConnection, не должны закрываться в методе Finalize.
Это довольно неловкая ситуация. На данный момент лучший способ для нас, по-видимому, - не закрывать каждое соединение после использования и повторно открывать его перед использованием (это отнимает много времени). На самом деле мы рассматриваем игнорирование исключения во время метода Close in Finalize.
Я хотел бы спросить,
1) Реализует ли DBConnection в ADO.Net метод Finalize и закрывает ли реальное базовое соединение во время GC? Если это так, то игнорируйте исключение close в Finalize), которое не нанесет нам вреда.
2) Если нет, будут ли окончательно возвращены базовые соединения (возможно, из пула соединений?) Обратно в систему или пул соединений? Скажите, что система или пул соединений будут проверять ненормальные состояния соединения и возвращать ресурсы через некоторое время?
Спасибо.