0

ASP.Net 2.0 Web フォームで記述された古い Web アプリケーションがあります。Enterprise Library のデータ アクセス ブロックを使用しており、最近バージョン 5.0 に更新しました。アプリケーションは階層化されています。つまり、UI レイヤー、サービス レイヤー、データ レイヤーです。また、データ ストレージに SQL Server 2008 を使用します。

最近、アプリケーションを実行して特定のページを参照すると、次のエラーが表示されることに気付きました。

タイムアウトになりました。プールから接続を取得する前に、タイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。

これは、データベースから多くの個別の読み取りを行うページで発生する傾向があり、1 ページで最大 20 回になることもあります。

以下に、私のデータ アクセス クラスのスニペットを示します。

Public Class DataAccess

    ' create a private instance of the database factory
    Private db As Database = DatabaseFactory.CreateDatabase()

    Public Function ExecuteNonQuery(ByVal params() As SqlParameter, ByVal strSproc As String) As Integer

    Dim intReturnValue As Integer = 0
    Dim i As Integer
    Dim cmd As DbCommand

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

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

    db.AddParameter(cmd, "return_value", DbType.Int32, ParameterDirection.ReturnValue, "", DataRowVersion.Default, 0)

    db.ExecuteNonQuery(cmd)
    intReturnValue = Int32.Parse(db.GetParameterValue(cmd, "@return_value"))

    Return intReturnValue

    End Function



    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

私のコード全体で、SqlDataReader を使い終わったら、私はいつもこのようなことをします

If Not (drSource Is Nothing) Then
   drSource.Close()
End If

私が行方不明になっていることがわかるものはありますか?コードが接続をリークしているか、正しく閉じていないように見えますか?

私はいつもガベージコレクターが開いている接続をすべて取り除くと思っていました。

フィードバックやヘルプをいただければ幸いです。

ありがとう。

4

1 に答える 1

0

コードはデータリーダーを閉じていますが、それに関連付けられているデータ接続は閉じていません。

データリーダーはであるためSqlDataReaderConnectionプロパティがあります。これを使用して、接続を閉じて破棄できるはずです。

于 2012-10-24T14:41:29.513 に答える