Закрытие соединения в методе «выгрузки»

Я унаследовал веб-фреймворк, посредством которого предыдущий разработчик открывал и закрывал свои соединения с базой данных в методах инициализации / выгрузки жизненного цикла страницы. По сути, конструктор подобен этому (упрощен для демонстрации точка);

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();
      }
   }
}

Разработка шла довольно быстро с тех пор, как я приехал сюда, поэтому я никогда не останавливался, чтобы обдумать это. В последнее время количество посещений увеличилось, и мы начали получать ужасный "Тайм-аут истек. Период тайм-аута истек до получения соединение из пула ... "ошибка.

В настоящее время я просматриваю остальную часть кода в поисках возможных утечек соединения, но приведенный выше код никогда не устраивал меня, и я хочу исключить его как потенциальную виновник. Тогда перейдем к вопросу:

Могу ли я полагаться на то, что метод "выгрузки" ВСЕГДА вызывается, даже в случае исключения? Или кто-нибудь может увидеть какие-либо другие потенциальные проблемы, используя приведенный выше шаблон, который сделает его основным подозреваете в этих утечках соединения?

Ура s,

Майки

РЕДАКТИРОВАТЬ: При отладке всегда вызывается метод выгрузки, даже если есть исключение. Мне действительно просто нужно знать какие-либо сценарии, в которых этот метод не будет вызываться, чтобы я мог выяснить, нужно ли сначала рефакторировать этот бит.

РЕДАКТИРОВАТЬ: Спасибо тем, кто ответил на данный момент, но, пожалуйста, не больше рекомендации по классу IDisposable или шаблонам "using" или "catch / finally" - это был не мой вопрос! Мой вопрос, в частности, может ли страница когда-либо запускать событие «Init», но затем не запускаться, является событием «Unload», и почему это может произойти.

5
задан Mikey Hogarth 11 July 2011 в 13:56
поделиться