我有其他.cs文件而不是System.Web.UI.Page(公共部分类页面:BasePage)使用的BasePage.cs类。
我正在使用它来打开和关闭SQL连接,以确保每个SQL连接都被关闭。
代码看起来像这样
{
public class BasePage: System.Web.UI.Page
{
public SqlConnection globalConnection;
protected override void OnInit(EventArgs e)
{
globalConnection = new SqlConnection();
globalConnection.ConnectionString = ConfigurationManager.ConnectionStrings["kontemiConnectionString"].ToString();
globalConnection.Open();
}
protected override void OnUnload(EventArgs e)
{
if (globalConnection != null)
{
globalConnection.Close();
}
}
}
}
到目前为止,它对我来说效果很好。这意味着每次打开连接时它也会被关闭。或者至少我是这么认为的。
我的问题是这个解决方案是否是防弹的,并且在代码执行期间出现一些处理错误时,每个连接都会关闭。在跟踪此代码时,如果我故意创建错误500,它将始终转到OnUnload事件并关闭。
那么,你觉得这个执行安全吗? (要停止讨论我是否应该在实际需要时打开SQL,回答是每个使用BasePage的页面也会打开SQL连接。)
答案 0 :(得分:2)
打开和关闭使用它们的SQL连接是更好的做法。无论如何,CLR管理连接池 - 重用连接并在它认为合适时关闭它们。使用相同的连接字符串进行大量打开和关闭连接并不会产生如您所料的那么多的开销。
答案 1 :(得分:1)
我可能错了,但我的猜测是,如果页面生命周期在OnUnload
触发前通过异常结束,则连接不会关闭。至少你可以做的就是确保你在全局“最后机会”级别上捕获所有异常,并关闭那里的连接。我仍然认为在本地使用连接,理想情况下使用using
块,是更好的解决方案,因为它不会使连接打开的时间超过它所需的时间,并且您不必担心关闭它们(语义为using
将为您完成工作。)