我试图了解 MS 企业库的数据访问块如何管理其与 SQL 的连接。我遇到的问题是,在稳定的负载下(来自负载测试),每隔 10 分钟,到 SQL 的连接数量会迅速增加 - 这会导致网站的页面响应时间明显增加。
这是我正在运行的场景:
- Visual Studio 负载测试工具,针对负载均衡器后面的 3 个 Web 服务器运行
- 这些工具可以全面了解所有 Web + DB 盒的性能计数器
- 每个测试大约需要 10 秒,并执行 4 次插入(表单数据),以及一些琐碎的选择
- 有 60 个测试同时运行。整个测试过程中负载没有增加或减少。
- 测试运行 20 分钟到 3 小时,结果一致。
这就是我们看到的问题:
- 恰好每 10 分钟,SQL 的性能计数器用于SQL General: User Connections增加 - 总共增加约 20 个连接
- 执行 HTTP 发布/数据库插入的页面是受影响最大的页面。其他页面显示适度但明显的上升。
- Web 服务器上的 CPU/内存负载不受影响
- 这种增加与页面响应时间的显着增加相对应 - 例如,从平均 0.3 秒到最多 5 秒
- 大约 5 分钟后,它会释放许多连接,而不会影响 Web 性能
- 以下 5 分钟的测试给出了相同(正常)的 Web 性能
- 最终,该图看起来像一个方波
- 再次发生,在第一次上升后 10 分钟
我看过的:
数据库调用:
数据库中的所有调用都以:
SqlDatabase database = new SqlDatabase([...]);
并在不需要输出的情况下执行任一过程:
return database.ExecuteScalar([...], [...]);
或者阅读包装在 using 语句中:
using (SqlDataReader reader = (SqlDataReader)database.ExecuteReader([...], [...]))
{
[...]
}
没有直接使用 SqlConnection,没有 .Open() 或 .Close() 方法,也没有抛出异常
数据库验证:
我们在登录/注销事件上运行 SQL 分析器,并使用sp_who2命令拍摄快照,显示谁拥有连接。后者表明确实网站(由机器+凭据看到)正在保持连接。
没有计划的作业(DB 或 Web 服务器),并且当 Web 服务器没有负载时,用户连接负载是稳定的。
连接池配置
我知道可以使用连接字符串更改连接池的最小和最大大小。
例如:
"数据源=[服务器];初始目录=[x];集成安全=SSPI;最大池大小=75;最小池大小=5; "
后备措施可能是将最小尺寸设置为 ~10
我了解默认最大值为 100,默认最小值为 0(来自此处)
想到连接池(特定于此设置)和 SQL 中的用户连接性能计数器,我有点轻率。本文介绍这些连接池用于管理连接字符串,这似乎与我假设的不同(持有一个通常可用的连接池,以避免在 SQL 上重新打开它们的成本)
我仍然没有看到任何配置参数可以轻松默认为 5 或 10 分钟,在开始时归零......
因此,任何帮助表示赞赏。
我知道 10 分钟的峰值听起来像是负载变化,或者正在发生新的活动——但我们已经非常努力地隔离这些和任何其他因素——对于这个问题,我希望了解 EL 扩大其连接和向下。
谢谢。