如果您正在使用.NET连接到SQL Server,则自.NET 3.5起禁用了额外的重置调用 - 请参见此处。 (该属性仍然存在,但不起作用。)我想微软意识到(正如某人在这里进行实验所做的那样),避免重置的门户比获得(可能)小的性能收益更加危险。 我不能责怪他们。
客户端是否发送exec sp_reset_connection,等待响应,然后发送真正的sql?
编辑:我错了-请参见此处-答案是否定的。
总结:在TDS消息中设置了一个特殊位,指定应重置连接,并且SQL Server会自动执行sp_reset_connection。 它出现在Profiler中的一个单独批处理中,并且始终在您要执行的实际查询之前执行,因此我的测试无效。
是的,它被发送到一个单独的批处理中。
我编写了一个小的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();
行上设置断点并运行程序。
第一次步入时,只有查询运行,并且在等待5秒后,您只会得到SQL:BatchCompleted事件。当第二次命中断点时,Profiler中仍然只显示一个事件。再次步入时,您立即看到exec sp_reset_connection
事件,然后延迟后SQL:BatchCompleted事件出现。
摆脱exec sp_reset_connection
调用(这可能是您的合法性能问题)的唯一方法是关闭.NET的连接池。如果您打算这样做,您可能需要构建自己的连接池机制,因为仅仅关闭它而不采取其他措施可能会对整体造成更大的伤害,并且您将不得不手动处理正确性问题。