Я унаследовал веб-фреймворк, посредством которого предыдущий разработчик открывал и закрывал соединения с базой данных в методах init / unload жизненного цикла страницы.По сути, конструктор такой (упрощенный, чтобы продемонстрировать смысл);
public class BasePage
{
protected DBConnection _conn;
public BasePage()
{
Init += StartConnection;
Unload += EndConnection;
}
private void StartConnection(object sender, EventArgs e)
{
_conn = new DBConnection(Application["connectionstring"].ToString());
}
private void EndConnection(object sender, EventArgs e)
{
if (_conn == null)
return;
if (_conn.Connection.State == ConnectionState.Open)
{
_conn.Close();
_conn.Dispose();
}
}
}
С тех пор, как я попал сюда, разработка была довольно быстрой, поэтому я никогда не останавливался, чтобы рассмотреть ее.Недавно посещения были завершены, и мы начали получать страшную ошибку «Истекло время ожидания. Период ожидания истек до получения соединения из пула ...».
В настоящее время я перебираю оставшуюся часть кода в поисках возможных утечек соединения, но приведенный выше код никогда не подходил мне, и я хочу устранить его как потенциального преступника.Тогда к вопросу;
Могу ли я рассчитывать на то, что метод unload вызывается ВСЕГДА, даже в случае исключения?Или кто-то может увидеть какие-либо другие потенциальные проблемы, используя приведенный выше шаблон, который сделает его основным подозреваемым для этих утечек соединения?метод unload всегда вызывается, даже если есть исключение.Мне просто нужно знать о любых сценариях, в которых этот метод не будет вызываться, поэтому я могу выяснить, нужен ли мне этот бит для рефакторинга в первую очередь.
РЕДАКТИРОВАТЬ: Спасибо тем, кто уже ответил, нопожалуйста, больше никаких рекомендаций по поводу класса IDisposable или шаблонов "using" или "catch / finally" - это был не мой вопрос!Мой вопрос, в частности, может ли страница когда-либо запускать событие «Init», но затем не запускаться - это событие «Unload», и почему это может произойти.