【发布时间】:2011-07-11 11:04:42
【问题描述】:
我继承了一个 web 框架,之前的开发人员在页面生命周期的 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();
}
}
}
自从我来到这里以来,发展一直很快,所以我从未停下来考虑它。最近,访问量增加了,我们开始收到可怕的“超时已过期。在从池中获取连接之前超时时间已过...”错误。
我目前正在检查其余代码以寻找可能的连接泄漏,但上面的代码从未完全适合我,我想将其作为潜在的罪魁祸首消除。那么问题来了;
我是否可以依赖“卸载”方法总是被调用,即使发生异常?或者任何人都可以看到使用上述模式的任何其他潜在问题,这将使其成为这些连接泄漏的主要嫌疑人?
干杯,
米奇
编辑:在调试中,卸载方法总是被调用,即使有异常。我真的只需要知道不会调用此方法的任何场景,这样我就可以确定这是否是我需要首先重构的部分。
编辑:感谢迄今为止做出回应的人,但请不要再提供有关 IDisposable 类或“使用”或“捕获/最终”模式的建议 - 这不是我的问题!我的问题是一个页面是否可以运行它的“Init”事件但随后无法运行是“Unload”事件,以及为什么会发生这种情况。
【问题讨论】:
标签: c# asp.net database-connection connection-pooling page-lifecycle