SqlConnection 池似乎不起作用

And*_*hov 2 .net c# 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();
}
Run Code Online (Sandbox Code Playgroud)

运行此代码会产生类似于以下内容的 Sql Profiler 捕获的结果。观察多个登录/注销事件,如果池按宣传的那样工作,则不应捕获这些事件。我已经能够在多台机器(Windows 8/10、.NET 4.5、Sql Server 2014 Developer Edition)上重现这个。

在此处输入图片说明

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

Cos*_*Rus 5

如果发出sp_reset_connection,则启用连接池。请参阅sp_reset_connection 的作用是什么?

要查看 Profiler 中的 Audit Login 是池化还是非池化,您需要将EventSubClass列添加到 Trace 并检查 Audit Login 和 Audit Logout 事件。新列将显示“1 - Nonpooled”或“2 - Pooled”。在您的示例中,只有第一个连接具有“1 - Nonpooled”,接下来的 2 个审核登录具有 EventSubClass = “2 - Pooled”。