连接池比保持一个连接开启更慢

4
我观察到了我们创建的客户端应用程序中连接池表现的有趣行为。每当用户点击一个对象时,会从数据库中加载更多的对象特定数据。这需要大约10到30个查询才能完成,具体取决于对象。
我们通过使用连接池来完成这一操作,每次查询都会在一个新的连接上派发,并在查询运行后关闭该连接。
我已经分析了性能优化器中的查询,并看到了大量审核登录/注销条目。此外,性能并不理想,尽管查询本身运行良好(只有索引查找/扫描运算符)。
为了试验,我禁用了连接池并修改了代码以保留一个客户端应用程序的连接并重用它。这使整个应用程序变得更加响应,并且性能优化器中的所有审核登录/注销条目都消失了。
这是怎么可能的?难道连接不应该保持开放状态吗?或者即使它们实际上保持开放状态,至少也不应该这么慢吧?我们是否错误地使用了SqlConnection类,导致连接池被禁用?
我已经阅读了关于连接池的其他帖子,但没有发现连接池和重复使用相同连接之间有实质性的速度差异。
SqlConnection con = new SqlConnection(_connectionString);

连接被移交给一个包装类Session,该类提供事务功能。
class Session{
    Session(connection);
    Abort();
    Commit();
}

在Abort()和Commit()中断开连接,这两者总有一个被调用。


这只是一个猜测......但我记得几年前有这样一件事。看看:SqlConnection.ClearAllPools().......然后可能将其添加到您的测试(预测试)代码中。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearallpools.aspx - granadaCoder
@DanielKelley 是的,我们正在使用最终的连接字符串。 - caldis
从我之前发布的链接中可以看到:虽然MSDN文章表示该事件仅会在未重复使用的连接上引发,但SQL Server文档却与此相矛盾:“审核登录事件类指示用户已成功登录到Microsoft SQL Server。此类事件由新连接或从连接池中重复使用的连接触发。” - Keith Payne
@KeithPayne 我已经阅读了那个。那不是我怀疑连接池不起作用的原因。我怀疑的唯一原因是,当我改变连接处理方式时,性能显著提高了。 - caldis
你能详细说明一下“更加响应”的具体含义吗?显然,使用单个开放连接对象不可能比在后台使用多个连接对象池更慢。你能至少量化这种差异/加速吗? - Vivek
显示剩余12条评论
1个回答

0
如果我理解正确 - 连接每个会话都是“新的”。如果您希望所有实例共享连接,则应将其设置为静态。
将其放在global.asax中:
public static SqlConnection con;

protected void Application_Start(object sender, EventArgs e)
{
    con = new SqlConnection(_connectionString);
}

以这种方式,您将在会话之间共享相同的连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接