连接池比保持一个连接打开要慢

时间:2013-07-26 15:06:18

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

我观察到我们创建的客户端应用程序中连接池性能的一个有趣行为。当用户点击某个对象时,会从数据库中加载更多特定于对象的数据。根据对象的不同,每次点击需要10到30个查询。

这是通过使用连接池完成的,每个查询都是从池中的新连接调度的,并且在查询运行后连接已关闭。

我已经分析了探查器中的查询以进行性能优化,并且看到那里有很多审计登录/注销条目。此外,性能不是最佳的,尽管查询自己运行良好(只有索引搜索/扫描操作符)。

只是为了尝试它,我禁用了池并修改了代码以保持每个客户端应用程序的一个连接并重用它。这使得整个应用程序响应更快,并且所有审计登录/注销条目都从分析器中消失。

这怎么可能?连接不应该保持打开状态,或者它们是否真的保持打开状态至少不会这么慢?是否有可能我们使用SqlConnection类错误导致禁用池?

我已阅读其他有关汇集的帖子,但未发现有关池化连接和重用相同连接之间可感知速度差异的任何信息。

SqlConnection con = new SqlConnection(_connectionString);

连接被传递给包装类Session,后者提供事务功能。

class Session{
    Session(connection);
    Abort();
    Commit();
}

在Abort()和Commit()中关闭连接。其中一个总是被称为。

1 个答案:

答案 0 :(得分:0)

如果我理解正确 - 每个会话的连接都是“新的”。如果您希望所有实例共享连接,则应将其设置为静态。

将它放在global.asax:

public static SqlConnection con;

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

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