Доброго дня всем.
Вопрос следующего характера. Начал изучать LINQ. Создал DataContext в который перенёс хранимую процедуру из своей базы SQL.
В коде получаю данные:
Dim Info As New InfoDataContext()
' Забираем информацию
Dim DataQuery = (From Inf In Info.procMyFullInfoGet Select Inf).Single
Info.Dispose()
Данные выводятся, всё нормально. НО вот профайлер SQL Server показывает следующее:
Audit Login
RPC:Completed (запрос, сгенерированный LINQ)
То есть закрытия соединения не происходит.
Однако ещё интересный момент. Если вызвать запрос данных снова, то происходит такая вещь:
Audit Logout
RPC:Completed exec sp_reset_connection
Audit Login
RPC:Completed (запрос, сгенерированный LINQ)
То есть получается, перед тем, как выполнить запрос данных повторно, LINQ закрывает соединение и открывает его снова.
Закрытие соединения происходит также при выходе из приложения.
ВНИМАНИЕ ВОПРОС. Насколько корректно такое поведение? И не должен ли LINQ закрыть соединение после отработки запроса ИЛИ ЖЕ после вызовате метода Dispose?
SQL Server: select @@version
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) Jul 9 2008 14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.0 <X64> (Build 6001: Service Pack 1)
Заранее спасибо за ответы.
Здравствуйте, OTMOP, Вы писали:
OTM>Здравствуйте, C...R...a...S...H, Вы писали:
CRA>>Это называется Connection Pool
CRA>>Когда соединение с базой данных не разрывается, а используется повторно
OTM>А если попробовать преднамеренно его разорвать (например, перезагрузив сервер),
OTM>то LINQ не пытается автоматически переподключиться, а выкидает SQL Exception.
OTM>Таким образом, надо как-то отслеживать статус соединения, которое использут LINQ. Верно?
Попробуйте почитать:
http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx
Здравствуйте, C...R...a...S...H, Вы писали:
CRA>Попробуйте почитать:
CRA>http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx
Спасибо за статью.
То есть я так понимаю, что избежать проблемы отвалившегося соединения можно либо использовав "Pooling=False;" в строке подключения,
либо с помощью статического sqlConnection.ClearPool()?
А вы сталкивались с такой проблемой? Как решали проблему отваливающихся соединений?