连接池比保持一个连接打开要慢
我观察到了我们创建的客户端应用程序中连接池性能的一个有趣行为。 当用户点击某个对象时,会从数据库中加载更多特定于对象的数据。 根据对象的不同,每次点击需要10到30个查询。
这是通过使用连接池完成的,并且每个查询都是从池中的新连接调度的,并且在查询运行后连接已关闭。
我已经分析了探查器中的查询以进行性能优化,并看到那里有很多审计登录/注销条目。 此外,尽管查询自己运行良好(仅索引搜索/扫描操作符),但性能并非最佳。
只是为了尝试它,我禁用了池并修改了代码以保持每个客户端应用程序的一个连接并重用它。 这使整个应用程序响应更快,并且所有审计登录/注销条目都从分析器中消失。
这怎么可能? 连接不应该保持打开状态,或者它们是否实际保持打开状态至少不会这么慢? 是否有可能我们使用SqlConnection类错误导致禁用池?
我已经阅读了有关池化的其他post,但没有找到任何关于池化连接和重用相同连接之间可感知的速度差异的信息。
SqlConnection con = new SqlConnection(_connectionString);
连接被切换到提供事务function的包装类Session。
class Session{ Session(connection); Abort(); Commit(); }
连接在Abort()和Commit()中关闭。 其中一个总是被称为。
如果我理解正确 – 每个会话的连接都是“新的”。 如果您希望所有实例共享连接,则应将其设置为静态。
把它放在global.asax中:
public static SqlConnection con; protected void Application_Start(object sender, EventArgs e) { con = new SqlConnection(_connectionString); }
这样,您将在会话之间共享相同的连接。