Какова взаимосвязь между открытыми SqlConnections в клиентском приложении и процессами в SQL Server? - PullRequest
3 голосов
/ 13 августа 2010

Я только что попытался внести простое изменение схемы в таблицу в базе данных SQL Server (с помощью инструмента «Дизайн» в SMSS). Всякий раз, когда я пытался сохранить изменения, время истекало. Я задавался вопросом, было ли это из-за существующих соединений, которые «блокировали» стол.

Я решил уничтожить соединения в качестве эксперимента. Я запросил master..sysprocesses, чтобы получить текущие спиды для этой базы данных, и убивал их один за другим, пока не смог сохранить изменение своей схемы. (Не очень научный, но я далеко не эксперт по SQL Server). Конечно же, когда я убил все спиды (за исключением того, что я использовал с помощью SMSS), я смог сохранить изменение схемы.

Я хотел бы спросить о связи между ADO.NET SqlConnections и spids. Например, если клиентское приложение вызывает Open () для объекта SqlConnection, я должен увидеть другой spid в master..sysprocesses? А что если я вызову Close () для этого SqlConnection? Должен ли спид исчезнуть?

Я уверен, что не все так просто, так как я понимаю, что существует понятие пула соединений, но может кто-нибудь пролить свет на то, как эти отношения работают?

Спасибо

David

1 Ответ

1 голос
/ 16 сентября 2011

Если пул = false в строке подключения

SqlConnection.Open() и Close() будут точно соответствовать созданным и уничтоженным спидам. Это приводит к очень низкой производительности:)

Если пул = true в строке подключения

При вызове SqlConnection.Open() либо будет использоваться существующее физическое соединение из пула, либо будет создано новое, если в пуле нет доступных.

Создание нового физического соединения создаст новый spid, который будет отображаться в виде новой строки в sys.sysprocesses и sys.dm_exec_connections.

Повторное использование существующего пулированного физического соединения просто повторно использует существующий spid, поэтому вы SqlConnection.Open() не внесете никаких видимых изменений в эти таблицы на стороне сервера. Однако его можно обнаружить с помощью SQL Profiler или XEvent, выполнив поиск sp_reset_connection, который представляет собой хранимую процедуру, вызываемую SqlClient, которая сообщает серверу очистить состояние соединения (например, убедитесь, что транзакции отсутствуют и т. Д.).

SqlConnection.Close() обычно возвращает физическое соединение с пулом, поэтому оно не исчезает с сервера. Физические соединения на самом деле закрыты различными способами, например, из-за уничтожения сервером, например kill @spid и SqlConnection.ClearAllPools().

Надеюсь, достаточно подробностей, есть что-нибудь еще, что вы хотели бы знать?

...