我有一个使用Server 2008的ASP.Net 2.0WebForms应用程序。应用程序有UI层和数据访问层。我使用EnterpriseLibray5.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();请有人看看上面的代码,让我知道如何正确地关闭我的数据库连接,或者我已经在这么做了?
谢谢你们的帮助。
发布于 2012-10-25 11:45:13
您是否尝试过获得对ExecuteReader的底层调用以接受CommandBehavior.CloseConnection参数?至少这将确保连接在DataReader也关闭时关闭。这将依赖于从ExecuteDataReader()传递回来的ExecuteDataReader的使用者显式地关闭它或通过使用块进行处置。
或者,尝试在drSource.Close()行后面的代码中添加以下内容:
drSource.Connection.Close()https://stackoverflow.com/questions/13066195
复制相似问题