Какова взаимосвязь между открытыми 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()
,
Надеюсь, что это достаточно подробно, есть что-нибудь еще, что вы хотели бы знать?