Mik*_*rth 5 c# asp.net database-connection connection-pooling page-lifecycle
我继承了一个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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
自从我来到这里以来,发展一直很快,所以我从未停下来考虑它.最近,访问已经开始,我们已经开始获得可怕的"Timeout过期.在从池中获取连接之前已经过了超时时间......"错误.
我目前正在查看其余的代码,寻找可能的连接泄漏,但上面的代码从来没有完全适合我,我想消除它作为潜在的罪魁祸首.那么问题;
即使在发生异常的情况下,我是否可以依赖"卸载"方法始终被调用?或者任何人都可以使用上述模式看到任何其他潜在问题,这将使其成为这些连接泄漏的主要嫌疑人?
干杯,
米奇
编辑:在调试中,即使存在异常,也始终会调用unload方法.我真的只需要知道不会调用此方法的任何情况,所以我可以弄清楚这是否需要首先进行重构.
编辑:感谢那些迄今为止做出回应的人,但请不要再提出关于IDisposable类或"使用"或"捕获/最终"模式的建议 - 这不是我的问题!我的问题是具体是一个页面是否可以运行其"Init"事件但是然后无法运行是"卸载"事件,以及为什么会发生这种情况.
我不知道这是否安全,但我浏览了 System.Web.UI.Page 类的源代码,卸载事件由私有 ProcessRequestCleanup() 触发,除非请求是异步的或跨页面请求。对 clean up 方法的调用位于与 ProcessRequest 周围的 try 块耦合的 finally 块内。处理请求正在触发从PreInit到Render的所有页面生命周期事件。这意味着即使发生异常,卸载也将始终被触发(异步和跨页情况除外)。
然而,在我的页面中包含此代码我会感到非常不安,因为卸载的行为没有准确记录。
| 归档时间: |
|
| 查看次数: |
1620 次 |
| 最近记录: |