2012-10-24 109 views
0

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

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

超时已过期。在从池中获取连接之前已超时。发生这种情况的原因可能是因为所有连接池都在使用中,并且达到最大池大小。

这种情况往往发生在与数据库进行大量单独读取的页面上,也许在一个页面上多达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 

你有没有什么人能看到,我很想念?它看起来像我的代码可能泄漏连接或不正确关闭?

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

任何反馈或帮助将不胜感激。

谢谢。

回答

0

您的代码正在关闭数据读取器,但未关闭与其关联的数据连接。

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