如果我在ASP.NET网页中打开数据库连接会发生什么

时间:2010-02-09 05:38:27

标签: asp.net database ado.net

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

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

5 个答案:

答案 0 :(得分:7)

MSDN documentation对此很清楚:

  

如果SqlConnection没用了   范围,它不会被关闭。因此,   你必须明确关闭   通过调用Close或者连接   处置。关闭和处理是   在功能上等同。

使用using块自动处理,或明确.Close()它。 using块是首选。

通过保持连接打开,当尝试新请求时,您的应用程序最终可能会耗尽连接,从而导致错误。我在调试的应用程序中遇到了这样的问题。原始开发人员未能在几页上明确关闭连接,并且流量足够高,用户开始收到错误。我将有问题的连接包裹在using块中,问题就消失了。

答案 1 :(得分:3)

连接仍未解决。如果您有大量的综合浏览量和大量的开放式连接,则可能会出现500错误。

答案 2 :(得分:3)

在您的页面对象完成之后(而不是何时),您的连接将不会关闭,这可能需要一段时间。最大化可用连接数并开始出错是非常容易的。

答案 3 :(得分:2)

您应该使用using块,然后您不必提问:

using (var conn = new SqlConnection(connectionString))
{
    using (var cmd = new SqlCommand(commandText, conn))
    {
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read()) { /* ... */ }
        }
    }
}

答案 4 :(得分:2)

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