Asp.Net - (Sql)连接未关闭

时间:2017-05-21 20:47:16

标签: sql asp.net connection

我的问题总是发生在我的网站上。无论我尝试什么,我无法摆脱这一点。

在我的asp.net项目中,我使用的是microfost azure服务器和数据库。我一次又一次检查了所有查询。无论何时我打开连接,我肯定会关闭它。

在我打开sql连接之前,几乎每个函数都检查连接状态,如:

if (conn.State != System.Data.ConnectionState.Closed) { conn.Close(); }

如果我多次刷新主页,我会收到错误,大部分时间都没有多次刷新我得到了相同的结果。

**The connection was not closed. The connection's current state is open.**

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The connection was not closed. The connection's current state is open.

任何人都可以帮我解决在这种情况下我能做些什么吗?

2 个答案:

答案 0 :(得分:0)

异常可能表示当您尝试打开连接时连接已打开。您是否共享由不同线程上的多个进程使用的全局连接?这将导致它,也可能解释为什么问题是间歇性的。

SqlConnection.Open()的文档中提到了InvalidOperationException

最好在每次需要时显式创建新连接,然后在完成后调用Dispose()。您可以拨打Close(),但更简单的模式是using,例如

using(var connection = new SqlConnection("yourConnectionString"))
{
    connection.Open() // open it right before you execute something
}

using语句确保始终调用Dispose()Dispose()来电Close()。因此,如果您创建上述连接,您的连接将始终关闭。

在您Close()Dispose()的幕后,框架并非真正关闭连接。至少不是马上。它保留了一个打开的连接池并重新使用它们,因为它比打开和关闭连接更有效。因此,如果你打开一个连接,关闭它,用相同的连接字符串打开另一个连接,关闭它,等等,很可能在幕后它实际上是完全相同的连接。但框架在幕后为您处理。如果未使用连接,则连接确实将关闭。请参阅connection pooling

因此,虽然尝试重用相同的SqlConnection似乎有效,但是根据需要创建和Dispose()并且让连接池管理连接的生命周期真的很好场景。

答案 1 :(得分:0)

您应该在关闭连接时仔细检查异常。

try{
    stmt.close();
    connection.close();
    connection = null;
}catch(Exception e){
    try{
        connection.close();
        connection = null;
    }catch(Exception e){
    }
}