Вот пример моего кода в DAL. Все вызовы хранимых процедур базы данных структурированы таким образом, и встроенного SQL нет.
Friend Shared Function Save(ByVal s As MyClass) As Boolean
Dim cn As SqlClient.SqlConnection = Dal.Connections.MyAppConnection
Dim cmd As New SqlClient.SqlCommand
Try
cmd.Connection = cn
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "proc_save_my_class"
cmd.Parameters.AddWithValue("@param1", s.Foo)
cmd.Parameters.AddWithValue("@param2", s.Bar)
Return True
Finally
Dal.Utility.CleanupAdoObjects(cmd, cn)
End Try
End Function
Вот фабрика соединений (если я использую правильный термин):
Friend Shared Function MyAppConnection() As SqlClient.SqlConnection
Dim cn As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionString").ToString)
cn.Open()
If cn.State <> ConnectionState.Open Then
' CriticalException is a custom object inheriting from Exception.
Throw New CriticalException("Could not connect to the database.")
Else
Return cn
End If
End Function
Вот функция Dal.Utility.CleaupAdoObjects ():
Friend Shared Sub CleanupAdoObjects(ByVal cmd As SqlCommand, ByVal cn As SqlConnection)
If cmd IsNot Nothing Then cmd.Dispose()
If cn IsNot Nothing AndAlso cn.State <> ConnectionState.Closed Then cn.Close()
End Sub
Я получаю много сообщений: «Время ожидания истекло. Время ожидания истекло до завершения операции, или сервер не отвечает». сообщения об ошибках, сообщаемые пользователями. DAL приложения открывает соединение, считывает или сохраняет данные и закрывает его. Нет открытых соединений - намеренно!
На Windows 2000 Server, на котором установлен SQL Server 2000, нет ничего очевидного, что указывало бы на проблему. Ничего в журналах событий и ничего в журналах SQL Server.
Тайм-ауты случаются случайно - я не могу воспроизвести. Это происходит в начале дня, когда в системе всего от 1 до 5 пользователей. Это также происходит с примерно 50 пользователями в системе. Наибольшее количество подключений к SQL Server через системный монитор для всех баз данных составляет около 74.
Тайм-ауты происходят в коде, который одновременно сохраняет и читает из базы данных в различных частях приложения. Трассировка стека не указывает на одну или две ошибочные функции DAL. Это случилось во многих разных местах.
Может ли мой код ADO.NET пропускать соединения? Я немного прогулялся и прочитал, что, если пул соединений заполняется, это может произойти. Тем не менее, я не устанавливаю явно пул соединений. Я даже пытался увеличить время ожидания подключения в строке подключения, но время ожидания наступает задолго до значения 300 секунд (5 минут):
<add name="MyConnectionString" connectionString="Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=SSPI;Connection Timeout=300;"/>
Я уже в полной растерянности относительно того, что вызывает эти проблемы с тайм-аутом. Любые идеи приветствуются.
РЕДАКТИРОВАТЬ: Это приложение WinForms.