2012-10-24 111 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屬性。您應該可以使用它來關閉和處理連接。