【问题标题】:How safe or bad is using BasePage for opening and closing SQL connection?使用 BasePage 打开和关闭 SQL 连接的安全性或坏性如何?
【发布时间】:2010-09-02 15:51:20
【问题描述】:

我有 BasePage.cs 类,它被其他 .cs 文件使用,而不是 System.Web.UI.Page(公共部分类页面:BasePage)。

我用它来打开和关闭 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 连接。)

【问题讨论】:

    标签: sql class connection


    【解决方案1】:

    在您使用它们的地方打开和关闭 SQL 连接是更好的做法。在底层,CLR 无论如何都会管理连接池——重用连接并在它认为合适的时候关闭它们。对具有相同连接字符串的连接执行大量打开和关闭操作不会像您预期的那样增加开销。

    【讨论】:

      【解决方案2】:

      我可能是错的,但我的猜测是,如果页面生命周期在OnUnload 触发之前通过异常结束,则连接不会关闭。为防止这种情况,您至少可以做的是确保在全局“最后机会”级别捕获所有异常,然后关闭那里的连接。我仍然认为在本地使用连接,最好是使用 using 块,是更好的解决方案,因为它不会使连接保持打开的时间超过它需要的时间,而且您不必担心关闭它们(@987654323 的语义@ 将为您完成工作)。

      【讨论】:

      • 全局有必要吗?你不能只使用页面的错误事件吗?
      • 我可以保留其余代码吗?这意味着我将全局定义 SqlObject 和 ConnectionString?然后只需使用块调用?或者我应该将连接字符串放入 Global.asax 中,因为它总是相同的并且不需要加载每个页面?
      • @Jace Rhea:可以,但全局更安全。我遇到过页面的 OnError 没有触发但全局错误处理程序捕获异常的情况。 @feronovak:当然不是。 using 块用于创建、使用并最终处置实现 IDisposable 的对象。如果你不那样使用它,那么使用它根本没有任何意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      相关资源
      最近更新 更多