Закрытие SqlDataReader

У меня есть приложение веб-форм ASP.Net 2.0, использующее SQL Server 2008. Приложение имеет уровень пользовательского интерфейса и уровень доступа к данным. Я использую 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

Код пользовательского интерфейса за страницей

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();

Может кто-нибудь посмотреть на приведенный выше код и сообщить мне, как правильно закрыть мои соединения с базой данных, или, может быть, я уже делаю это?

Спасибо за вашу помощь.


person tcode    schedule 25.10.2012    source источник


Ответы (1)


Вы пытались заставить базовый вызов ExecuteReader принимать параметр CommandBehavior.CloseConnection? По крайней мере, это гарантирует, что соединение будет закрыто, когда DataReader также будет закрыт. Это будет зависеть от потребителей DataReader, переданных обратно из ExecuteDataReader(), чтобы закрыть его явно или удалить через блок Using.

В качестве альтернативы попробуйте добавить следующий код в код после строки drSource.Close():

 drSource.Connection.Close()
person David Osborne    schedule 25.10.2012
comment
Сказав это, я только что просмотрел справку по методу ExecuteReader() с помощью EnterpriseLibrary, и нет никакого способа сделать то, что я предложил. Каждая перегрузка метода имеет следующее предостережение: «Вызывающий объект обязан закрыть соединение и читатель после завершения». Вам нужно будет перейти непосредственно к ADO.NET, чтобы сделать то, что я предложил. - person David Osborne; 25.10.2012