2010-08-13 5 views
3

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

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

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

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

Спасибо

Дэвид

ответ

1

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

SqlConnection.Open() и Close() будет точно коррелируют с ИСПОМ создаются и уничтожаются. Это приводит к очень низкой производительности :)

Если пулы = истина в строке соединения

Calling 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().

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

+0

Нет, это точно то, что я просил. Спасибо! – David