企业库5.0连接池超时

时间:2012-10-24 14:27:02

标签: asp.net webforms timeout enterprise-library

我有一个用ASP.Net 2.0 Web Forms编写的旧Web应用程序。我使用企业库中的数据访问块,最近更新到5.0版。应用程序是分层的,即UI层,服务层,数据层。它还使用SQL Server 2008进行数据存储。

我最近注意到,当我运行应用程序并浏览到特定页面时,会出现以下错误。

超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。

这往往发生在从数据库中进行大量单独读取的页面上,一页上可能多达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

你有什么东西可以看到我失踪了吗?看起来我的代码可能是泄漏连接还是没有正确关闭?

我一直认为垃圾收集器摆脱了任何打开的连接。

非常感谢任何反馈或帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

您的代码正在关闭数据阅读器,但不关闭与之关联的数据连接。

由于您的数据阅读器是SqlDataReader,因此它具有Connection属性。您应该能够使用它来关闭和处理连接。