Если вы используете .NET для подключения к SQL Server, отключение дополнительного вызова сброса было отключено с .NET 3.5 - см. здесь .(Свойство остается, но оно ничего не делает.)
Я предполагаю, что Microsoft поняла (как кто-то экспериментально здесь ), что открытие двери, чтобы избежать сброса, было намного более опасным, чем это былополучить (вероятно) небольшой прирост производительности.Не могу сказать, что я их виню.
Отправляет ли клиент exec sp_reset_connection
, ждет ответа, а затем отправляет настоящий sql?
РЕДАКТИРОВАТЬ: Я был не прав - см. здесь - ответ - нет.
Резюме: в сообщении TDS установлен специальный бит, который указывает, что соединение должносбрасывается, и SQL Server автоматически выполняет sp_reset_connection
.Он выглядит как отдельный пакет в Профилировщике и всегда будет выполняться перед фактическим запросом, который вы хотели выполнить, поэтому мой тест был недействительным.
Да, он отправляется в отдельном пакете.
Я собрал небольшую тестовую программу на C #, чтобы продемонстрировать это, потому что мне было любопытно:
using System.Data.SqlClient;
(...)
private void Form1_Load(object sender, EventArgs e)
{
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
csb.DataSource = @"MyInstanceName";
csb.IntegratedSecurity = true;
csb.InitialCatalog = "master";
csb.ApplicationName = "blarg";
for (int i = 0; i < 2; i++)
_RunQuery(csb);
}
private void _RunQuery(SqlConnectionStringBuilder csb)
{
using (SqlConnection conn = new SqlConnection(csb.ToString()))
{
conn.Open();
SqlCommand cmd = new SqlCommand("WAITFOR DELAY '00:00:05'", conn);
cmd.ExecuteNonQuery();
}
}
Запустите Profiler и прикрепите его к вашему выбранному экземпляру, отфильтровав пустое имя приложения, которое я предоставил.Затем поместите точку останова в строку cmd.ExecuteNonQuery();
и запустите программу.
При первом выполнении шага выполняется только запрос, и все, что вы получите, - это событие SQL: BatchCompleted после 5-секундного ожидания.Когда точка останова попадает во второй раз, все, что вы видите в профилировщике, - это всего лишь одно событие.При повторном шаге вы немедленно увидите событие exec sp_reset_connection
, а затем событие SQL: BatchCompleted появится после задержки.
Единственный способ избавиться от вызова exec sp_reset_connection
(который может или не может быть проблемой для вас), это отключить пул соединений .NET.И если вы планируете это сделать, вы, вероятно, захотите создать свой собственный механизм пула соединений, потому что простое его отключение и бездействие, скорее всего, повредят в целом больше, чем попадание в дополнительный обход, и вы получитесправиться с вопросами правильности вручную.