我继承了一个 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();
}
}
}
自从我来到这里以来,发展速度相当快,所以我从未停下来考虑它。最近,访问量有所增加,我们开始收到可怕的“超时已过期。从池中获取连接之前超时时间已过...”错误。
我目前正在检查其余的代码,寻找可能的连接泄漏,但上面的代码从来没有完全符合我的要求,我想消除它作为潜在的罪魁祸首。那么接下来的问题;
即使发生异常,我是否可以始终调用“卸载”方法?或者任何人都可以使用上述模式看到任何其他潜在问题,从而使其成为这些连接泄漏的主要嫌疑人?
Cheers,
Mikey
编辑:在调试中,即使出现异常,卸载方法也总是被调用。我真的只需要知道不会调用此方法的任何场景,这样我就可以弄清楚这是否是我需要首先重构的部分。
编辑:感谢那些到目前为止做出回应的人,但请不要再提出有关 IDisposable 类或“使用”或“catch/finally”模式的建议 - 这不是我的问题!我的问题具体是,页面是否可以运行其“Init”事件,但随后无法运行“Unload”事件,以及为什么会发生这种情况。
我不知道这是否安全,但我浏览了 System.Web.UI.Page 类的源代码,卸载事件由私有 ProcessRequestCleanup() 触发,除非请求是异步的或跨页面请求。对 clean up 方法的调用位于与 ProcessRequest 周围的 try 块耦合的 finally 块内。处理请求正在触发从PreInit到Render的所有页面生命周期事件。这意味着即使发生异常,卸载也将始终被触发(异步和跨页情况除外)。
然而,我会感到非常不安,因为卸载的行为没有被准确记录在我的页面中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)