У меня есть приложение веб-форм ASP.Net 2.0, использующее SQL Server 2008. Приложение имеет уровень пользовательского интерфейса и уровень доступа к данным. Я использую Enterprise Libray 5.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
Код пользовательского интерфейса за страницей
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();
Может кто-нибудь посмотреть на приведенный выше код и сообщить мне, как правильно закрыть мои соединения с базой данных, или, может быть, я уже делаю это?
Спасибо за вашу помощь.