gpt4 book ai didi

c# - 在 "unload"方法中关闭连接

转载 作者:太空狗 更新时间:2023-10-29 23:10:28 26 4
gpt4 key购买 nike

我继承了一个 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”事件,以及为什么会发生这种情况。

最佳答案

我不确定这是否安全,但我查看了 System.Web.UI.Page 类的源代码,卸载事件由私有(private) ProcessRequestCleanup() 触发,除非请求是异步的或跨页请求。对清理方法的调用在 finally block 内,该 block 耦合到 ProcessRequest 周围的 try block 。处理请求触发了从 PreInit 到 Render 的所有页面生命周期事件。这意味着 Unload 将始终被触发(异步和跨页面情况除外),即使发生异常也是如此。

但是,由于没有准确记录卸载行为,因此在我的页面中使用这段代码会让我感到非常不安。

关于c# - 在 "unload"方法中关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6649141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com