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

CommandBehavior.CloseConnection パラメーターを取得するために、基になる ExecuteReader の呼び出しを取得しようとしましたか? 少なくとも、これにより、DataReader も閉じられたときに接続が閉じられることが保証されます。これは、ExecuteDataReader() から返された DataReader のコンシューマーに依存して、それを明示的に閉じるか、Using ブロックを介して破棄します。

または、コード ビハインドの drSource.Close() 行の後に次を追加してみてください。

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