LINQ to SQL. Когда происходит закрытие соединения?
От: OTMOP Россия  
Дата: 31.10.08 11:52
Оценка:
Доброго дня всем.

Вопрос следующего характера. Начал изучать 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)



Заранее спасибо за ответы.
Viva la Resistance!
Re: LINQ to SQL. Когда происходит закрытие соединения?
От: C...R...a...S...H  
Дата: 31.10.08 12:07
Оценка:
Здравствуйте, OTMOP, Вы писали:


OTM>Заранее спасибо за ответы.

Это называется Connection Pool
Когда соединение с базой данных не разрывается, а используется повторно
Там было написано русским по белому...
Re[2]: LINQ to SQL. Когда происходит закрытие соединения?
От: OTMOP Россия  
Дата: 31.10.08 12:12
Оценка:
Здравствуйте, C...R...a...S...H, Вы писали:

CRA>Это называется Connection Pool

CRA>Когда соединение с базой данных не разрывается, а используется повторно

А если попробовать преднамеренно его разорвать (например, перезагрузив сервер),
то LINQ не пытается автоматически переподключиться, а выкидает SQL Exception.

Таким образом, надо как-то отслеживать статус соединения, которое использут LINQ. Верно?
Viva la Resistance!
Re[3]: LINQ to SQL. Когда происходит закрытие соединения?
От: C...R...a...S...H  
Дата: 31.10.08 12:53
Оценка: 2 (2)
Здравствуйте, 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
Там было написано русским по белому...
Re[3]: LINQ to SQL. Когда происходит закрытие соединения?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 31.10.08 13:46
Оценка:
Здравствуйте, OTMOP, Вы писали:

OTM>А если попробовать преднамеренно его разорвать (например, перезагрузив сервер),

OTM>то LINQ не пытается автоматически переподключиться, а выкидает SQL Exception.

OTM>Таким образом, надо как-то отслеживать статус соединения, которое использут LINQ. Верно?


LINQ тут ни при чём. Это "фича" ADO.NET.
[КУ] оккупировала армия.
Re[4]: LINQ to SQL. Когда происходит закрытие соединения?
От: OTMOP Россия  
Дата: 31.10.08 15:51
Оценка:
Здравствуйте, C...R...a...S...H, Вы писали:


CRA>Попробуйте почитать:

CRA>http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx

Спасибо за статью.

То есть я так понимаю, что избежать проблемы отвалившегося соединения можно либо использовав "Pooling=False;" в строке подключения,
либо с помощью статического sqlConnection.ClearPool()?

А вы сталкивались с такой проблемой? Как решали проблему отваливающихся соединений?
Viva la Resistance!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.