代码之家  ›  专栏  ›  技术社区  ›  MD Sayem Ahmed

如果在ASP.NET网页中保持数据库连接打开,会发生什么情况?

  •  7
  • MD Sayem Ahmed  · 技术社区  · 15 年前

    假设我有一个ASP.NET页面。在页面加载事件处理程序中,我打开一个数据库连接并进行一些处理。但在处理完成后,我不会通过调用连接对象的close方法显式关闭连接。

    现在,当服务器端的页面处理完成后,GC将处理我页面中的所有变量,以及连接对象。但是当释放它时,以前打开的连接是否自动关闭?我的意思是,当GC处理连接对象时,它是否自动关闭与数据库服务器建立的连接;或者它只是处理连接对象,并且数据库的连接保持打开状态,直到数据库发生连接超时,然后数据库服务器自行关闭连接?

    5 回复  |  直到 15 年前
        1
  •  7
  •   Ahmad Mageed    15 年前

    这个 MSDN documentation 很清楚这一点:

    如果sqlconnection退出 范围,它不会关闭。因此, 必须明确关闭 通过调用close或 处置。关闭并处理 功能等效。

    要么使用 using 将其自动或显式释放的块 .Close() 它。这个 使用 首选块。

    如果让连接保持打开状态,则在尝试新请求时,应用程序最终可能会耗尽连接,从而导致错误。我在调试的应用程序中遇到了这样的问题。最初的开发人员未能在几个页面上明确地关闭连接,并且流量足够大,用户开始出现错误。我用一个 使用 阻塞,问题就消失了。

        2
  •  3
  •   x2. alexey    15 年前

    连接保持打开状态。如果你有大量的页面视图和大量开放的连接,你会得到500个错误。

        3
  •  3
  •   Joel Coehoorn    15 年前

    您的连接只有在 之后 (不是在什么时候)您的页面对象已完成,这可能需要一段时间。将可用连接的数量最大化并开始出错将非常容易。

        4
  •  2
  •   John Saunders Tony    15 年前

    你应该使用 using 阻止,那么你就不必问问题了:

    using (var conn = new SqlConnection(connectionString))
    {
        using (var cmd = new SqlCommand(commandText, conn))
        {
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read()) { /* ... */ }
            }
        }
    }
    
        5
  •  2
  •   Vinay Pandey    15 年前

    除非由GC选择,否则您的连接不会被关闭,如果您有许多访问者,导致大量连接,那么这可能很可怕。另外,如果您试图打开一个打开的连接,它将抛出错误,因此您必须检查更好的方法是使用块将其写入或自己关闭连接。