0

我有一个使用 SQL Server 2008 的 ASP.Net 2.0 Web 窗体应用程序。该应用程序有一个 UI 层和数据访问层。我使用 Enterprise Libray 5.0 来保存数据。

最近我的网站运行得很慢,尤其是在可能有 15-20 次从数据库单独读取的页面上。我非常担心我的 SqlDataReader 数据库连接没有正确关闭。下面是代码如何工作的示例。如果您在泄漏连接方面发现任何问题,请查看并告诉我。

数据访问类

Public Class DataAccess

    Private db As Database = DatabaseFactory.CreateDatabase()

    Public Function ExecuteDataReader(ByVal params() As SqlParameter, ByVal SProc As String) As SqlDataReader

        Dim i As Integer
        Dim dr As SqlDataReader = Nothing
        Dim cmd As DbCommand

        cmd = db.GetStoredProcCommand(SProc)
        cmd.CommandTimeout = 120

        For i = 0 To params.Length - 1
            db.AddInParameter(cmd, params(i).ParameterName.ToString, params(i).DbType, params(i).Value)
        Next

        dr = TryCast(DirectCast(db.ExecuteReader(cmd), RefCountingDataReader).InnerReader, SqlDataReader)

        Return dr

    End Function

页面后面的 UI 代码

Dim drSource As SqlDataReader = Nothing
        Try
            Dim params(0) As SqlParameter
            params(0) = New SqlParameter("@applicant_id", Session("ApplicantID"))
            drSource = DataAccess.ExecuteDataReader(params, "sp_get_date_last_login")
            If drSource.HasRows Then
                drSource.Read()
                'Do code
            End If
        Finally
            If Not (drSource Is Nothing) Then
                drSource.Close()
            End If
        End Try

我试图将下面的代码放入我的ExecuteDataReader方法中,但这会在 SqlDataReader 有机会进行读取之前关闭它

if (cmd.Connection.State == ConnectionState.Open)
            cmd.Connection.Close();

有人可以看看上面的代码,让我知道如何正确关闭我的数据库连接,或者我已经在这样做了吗?

谢谢你们的帮助。

4

1 回答 1

2

您是否尝试过对 ExecuteReader 进行底层调用以获取 CommandBehavior.CloseConnection 参数?至少这将确保在 DataReader 也关闭时关闭连接。这将依赖从 ExecuteDataReader() 传回的 DataReader 的消费者来显式关闭它或通过 Using 块进行处理。

或者,尝试在 drSource.Close() 行后面的代码中添加以下内容:

 drSource.Connection.Close()
于 2012-10-25T11:45:13.017 回答