我试图优化访问SQL Server 2014数据库的代码性能,并注意到连接池似乎不像ADO.NET所宣传的那样工作。默认情况下,它应该被启用并开箱即用(只要使用相同的连接字符串)。我的实验表明,SqlConnection上的打开/关闭连接实际上会导致引发审核登录/注销。
根据https://msdn.microsoft.com/en-us/library/vstudio/8xx3tyca(v=vs.100).aspx,情况并非如此:
从连接池获取连接或返回连接池时,不会在服务器上引发登录和注销事件。这是因为连接在返回连接池时实际上并未关闭。
我的简单测试是创建一个控制台应用程序,类似于以下内容:
var conn = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=icedb;");
for (int i = 0; i < 3; i++)
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "select 1";
cmd.ExecuteScalar();
conn.Close();
}
运行此代码,由Sql Profiler捕获的结果类似于以下内容。观察多人登录/注销事件,如果池正如所宣传的那样工作,则应该没有捕获这些事件。我已经能够在多台机器上重现这一点(Windows 8/10,.NET 4.5,Sql Server 2014 Developer Edition)。
主要问题:如何让连接池工作。
答案 0 :(得分:4)
如果发出 sp_reset_connection ,则启用连接池。见What does sp_reset_connection do?
要查看Profiler中的审核登录是否已池化还是非池化,您需要将 EventSubClass 列添加到Trace并检查审核登录和审核注销事件。新列将显示“1 - Non-pooled”或“2-Pooled”。 在您的示例中,只有第一个连接具有“1 - Nonpoled”,接下来的2个审核登录具有EventSubClass =“2 - Pooled”。