Почему столько sp_resetconnections для организации пула подключений C#?

Еще одна распространенная ошибка - забыть написать [someInstance setSomeValue : 3]; вместо [someInstance someValue: 3] (< - неправильно). Это то, что случилось со мной.

8
задан skaffman 28 July 2011 в 08:26
поделиться

4 ответа

Сброс просто сбрасывает вещи, так что вам не нужно повторно подключать для их сброса. Он очищает соединение от таких вещей, как операции SET или USE, поэтому каждый запрос остается чистым.

Соединение все еще используется повторно. Вот расширенный список :

sp_reset_connection сбрасывает следующие аспекты соединения: уменьшить счетчик ссылок для пользователей в текущей базе данных; освобождает блокировку разделяемой базы данных

  • Освобождает полученные блокировки
  • Освобождает все дескрипторы, которые могли быть получены.
  • Сбрасывает все параметры SET до значений по умолчанию
  • Сбрасывает значение @@ rowcount
  • Он сбросит значение идентификатора @@
  • Он сбросит все параметры трассировки на уровне сеанса с помощью dbcc traceon ()
  • sp_reset_connection НЕ сбрасывает:

    • Контекст безопасности, поэтому пул подключений соответствует подключениям на основе точная строка подключения
    • Если вы ввели роль приложения с помощью процедуры sp_setapprole, поскольку роли приложения не могут быть отменены
    • Уровень изоляции транзакции (!)
    12
    ответ дан 5 December 2019 в 11:26
    поделиться

    Вот объяснение Что делает sp_reset_connection? , в котором, в частности, говорится: «Уровни API доступа к данным, такие как ODBC, OLE-DB и SqlClient, вызывают (внутреннюю) хранимую процедуру sp_reset_connection при повторном использовании соединения из пула соединений. Это делается для сброса состояния соединения перед его повторным использованием ». Затем он дает некоторые особенности того, что делает этот системный sproc. Это хорошо.

    1
    ответ дан 5 December 2019 в 11:26
    поделиться

    sp_resetconnection будет вызываться каждый раз, когда вы запрашиваете новое соединение из пула. Он должен это сделать, поскольку пул не может гарантировать пользователя (вы, вероятно, программист :) оставили соединение в надлежащем состоянии. например, возвращать старое соединение с незавершенными транзакциями было бы .. плохо.

    Число вызовов должно быть связано с числом раз, когда вы выбираете новое соединение.

    Что касается некоторых вызовов, занимающих нетривиальное количество времени, Я не уверен. Возможно, в это время сервер просто очень занят обработкой других вещей. Возможны задержки в сети.

    1
    ответ дан 5 December 2019 в 11:26
    поделиться

    В основном вызовы представляют собой информацию о состоянии очистки. Если у вас есть ЛЮБЫЕ открытые устройства чтения данных, это займет НАМНОГО больше времени. Это потому, что ваши DataReaders содержат только одну строку, но могут вытащить больше строк. Каждый из них также должен быть очищен, прежде чем можно будет продолжить сброс. Поэтому убедитесь, что у вас есть все в операторах using (), и что в некоторых из ваших операторов ничего не остается открытым.

    Сколько всего подключений у вас запущено, когда это происходит?

    Если у вас максимум 5 и вы нажмите все 5, затем вызов сброса заблокирует - и, похоже, это займет много времени. На самом деле это не так, это просто заблокировано, ожидая, когда объединенное соединение станет доступным.

    Также, если вы работаете в SQL Express, вы можете очень легко заблокироваться из-за требований к потокам (также может произойти в полном SQL Server,

    1
    ответ дан 5 December 2019 в 11:26
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: