SqlConnection池似乎不起作用

时间:2015-10-23 18:52:59

标签: c# .net sql-server ado.net connection-pooling

我试图优化访问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)。

enter image description here

主要问题:如何让连接池工作。

1 个答案:

答案 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”。

相关问题