4

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

这是通过使用连接池来完成的,每个查询都在池中的新连接上分派,并且在查询运行后连接关闭。

我已经分析了探查器中的查询以进行性能优化,并看到那里有很多审计登录/注销条目。此外,即使查询本身运行良好(仅索引查找/扫描运算符),性能也不是最佳的。

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

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

我已经阅读了有关池的其他帖子,但没有发现任何关于池连接和重用同一连接之间可感知的速度差异的信息。

SqlConnection con = new SqlConnection(_connectionString);

连接被移交给提供事务功能的包装类 Session。

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

连接在 Abort() 和 Commit() 中关闭。其中之一总是被调用。

4

1 回答 1

0

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

把它放在 global.asax 中:

public static SqlConnection con;

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

这样,您将在会话之间共享相同的连接。

于 2013-07-28T01:16:30.023 回答