Какова взаимосвязь между открытыми SqlConnections в клиентском приложении и процессами в SQL Server?

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

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

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

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

Спасибо

Дэвид

1 ответ

Решение

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

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(),

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

Другие вопросы по тегам