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