【问题标题】:Will this leave a connection open to my database?这会打开我的数据库的连接吗?
【发布时间】:2015-06-05 16:03:54
【问题描述】:

我有一些我继承的旧代码,我正在尝试确定此代码是否导致与我的数据库的连接保持打开状态。我对 ADO.net 不太熟悉,但据我所知,这应该会导致问题。

我有一个获取数据读取器的功能:

Public Shared Function ExecuteDataReader(ByRef ObjSqlCmd As SqlCommand, ByVal CSTRING As String) As IDataReader
    Try
        Dim cn As New SqlConnection(CSTRING)
        cn.Open()
        ObjSqlCmd.Connection = cn
        Return ObjSqlCmd.ExecuteReader(CommandBehavior.CloseConnection)
    Catch ex As Exception
        If ObjSqlCmd.Connection.State = ConnectionState.Open Then ObjSqlCmd.Connection.Close()
        Return Nothing
    End Try
End Function

然后用这个代码来读取:

Dim cmd As New SqlCommand
'set up command
Dim idr As IDataReader = ExecuteDataReader(cmd, "database")

    If idr Is Nothing Then
        If cmd.Connection.State = ConnectionState.Open Then cmd.Connection.Close()
        Return arrResult
    End If

    While idr.Read
        'read
    End While

    If cmd.Connection.State = ConnectionState.Open Then cmd.Connection.Close()

我可以看到它在最后关闭了连接(假设没有任何问题并且抛出异常)但是从 MSDN 他们说你应该总是关闭数据读取器。连接关闭时会关闭吗?

据我了解,代码

 ObjSqlCmd.ExecuteReader(CommandBehavior.CloseConnection)

除非数据读取器关闭,否则不会关闭连接。有人可以解释这里发生了什么,如果一切都可以正确关闭吗?我知道最好的做法是使用“using”然后try/catch/finally来关闭阅读器,原来的开发者似乎没有遵循这些做法。

【问题讨论】:

  • 当连接关闭(但 DataReader 未处理)时,您得到的是将释放(可能是大对象)留给 GC。此外,这种关闭连接的多重检查(IMO)容易出错且令人困惑。在您打开它的地方关闭连接并让异常冒泡,直到您能够做一些有意义的事情。

标签: asp.net .net vb.net ado.net sqlconnection


【解决方案1】:

是的,它会的。从数据读取器读取时发生的任何异常都将绕过结束语句。在某些时候,垃圾收集器将启动并处理并将连接释放回连接池。

但在此之前,无法使用连接。更糟糕的是,在执行命令时获得的任何锁都将一直保留到连接关闭。

使用 ...using 并不是最佳实践,因为。以这种方式管理命令和连接实际上要简单得多,也更安全

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多