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