MS Enterprise Library数据访问 - 了解SQL“用户连接”管理

时间:2012-10-16 06:26:23

标签: c# sql-server-2008 enterprise-library connection-pooling

我正在尝试了解MS Enterprise Library的数据访问块如何管理其与SQL的连接。我遇到的问题是,在稳定负载下(来自负载测试),每隔10分钟,与SQL的连接数量会迅速增加 - 这会导致网站响应时间显着增加。

这是我正在运行的场景:

  • Visual Studio加载测试工具,针对负载均衡器后面的3个Web服务器运行
    • 这些工具可以全面了解所有Web + DB框的性能计数器
  • 测试每次需要大约10秒,并执行4次插入(表单数据),并且一些琐碎选择
  • 有60个测试同时运行。整个测试期间负载没有增加或减少。
    • 测试运行20分钟至3小时,结果一致。

这就是我们看到的问题:

  • 每10分钟, SQL General:用户连接的SQL性能计数器增加 - 总共~20个连接
    • 执行HTTP post / DB insert的页面受影响最严重。其他页面显示温和,但明显上升。
    • Web服务器上的CPU /内存负载不受影响
  • 此增加对应于页面响应时间的显着增加 - 例如。从.3秒平均到最多5秒
  • 大约5分钟后,它会释放许多连接,不会影响网络性能
    • 以下5分钟的测试提供相同(正常)的网络性能
    • 最终,图表看起来像square wave
  • 在第一次上升后10分钟再次发生

我看过的内容:

数据库通话:

数据库中的所有调用都以:

开头
SqlDatabase database = new SqlDatabase([...]);

执行任一proc而不需要输出:

return database.ExecuteScalar([...], [...]);

或读取包含在using语句中:

using (SqlDataReader reader = (SqlDataReader)database.ExecuteReader([...], [...]))
{
    [...]
}

没有直接使用SqlConnection,没有.Open()或.Close()方法,也没有抛出异常

数据库验证:

我们在登录/注销事件上运行SQL分析器,并使用sp_who2命令拍摄快照,显示谁拥有这些连接。后者表明,网站(通过机器+凭证看到)确实存在连接。

没有预定作业(数据库或Web服务器),并且当Web服务器没有负载时用户连接负载稳定。

连接池配置

我知道min&可以使用连接字符串更改连接池的最大大小。

例如:

  

“数据源= [服务器];初始目录= [x];集成安全性= SSPI; 最大   泳池大小= 75;最小泳池大小= 5;

后退措施可能是将最小尺寸设置为~10

我理解默认最大值为100,默认最小值为0(from here

我有点想到连接池(特定于此设置)和SQL中的用户连接性能计数器。 This article将这些连接池引入用于管理连接字符串,这似乎与我的假设不同(保持通常可用的连接池,以避免在SQL上重新打开它们的成本)

我还没有看到任何可以轻易默认为5或10分钟的配置参数,为零...


所以,任何帮助都表示赞赏。

我知道10分钟的峰值听起来像负载的变化,或新的活动正在发生 - 但我们已经很努力地隔离那些&任何其他因素 - 对于这个问题,我希望了解EL扩展其连接和...下来。

感谢。

1 个答案:

答案 0 :(得分:0)

因此,事实证明,SQL用户连接已创建&只要所有其他连接都忙,就会添加到池中。因此,当长时间运行的查询发生,或者数据库没有响应时,它将选择扩展以管理负载。

在我们的案例中,原因恰好是SQL复制工作(不幸,但发现......) - 用户连接数的变化只是一个症状,而不是可能的原因。

虽然事情原因在其他地方,但我现在觉得我理解连接池管理,从这个(可以说是其他的)SQL库。