【问题标题】:Determining what to Raising Max Pool Size to for my Connection Pool确定为我的连接池提高最大池大小的内容
【发布时间】:2013-10-11 14:51:59
【问题描述】:

所以,我希望增加最大池大小。问题是我不知道“合理”的增加是多少。现在我没有设置它,只是使用默认值 100。以下是我更具体的问题:

  1. 为什么这个数字默认为 100,似乎很低。将其显着提高到 1000 或类似的值有什么负面影响?

  2. 有没有好的方法来确定这个 Max 应该提高到什么程度?

  3. 连接池的“范围”是什么?这个池是数据库的所有连接吗?每个“机器/服务器”连接都有自己的池?

背景:

当我的应用程序运行时,我们收到以下错误:

“超时。在从池中获取连接之前已经过了超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。”我已经阅读了很多其他类似问题的帖子,所有这些帖子都讨论了我应该如何做两件事中的一件。

  1. 确保在打开所有连接后关闭它们
  2. 增加最大池大小

我有一个非常大的应用程序,因此 (1) 很难确定某个连接是否未关闭。我找不到不是的。

【问题讨论】:

  • 这里有一个关于您是否需要的要点的很好总结:stackoverflow.com/questions/5793960/…;假设您已阅读本文并且确定您需要更多,这可能有助于查看您是否是leaking 连接? blogs.msdn.com/b/angelsb/archive/2004/08/25/220333.aspx
  • 如果您有连接泄漏(打开而不关闭)增加池大小可能无济于事,因为打开的连接会无限期地保持打开状态。默认情况下,100 能够在连接关闭并且查询发生相当快的情况下处理大负载。连接池在 .net 服务器端维护,因此每个 .net 服务器都维护自己的池
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 是的,我实际上是想将标题改为:“为我的连接池确定将最大池大小提高到什么。我没有看到可以在哪里编辑它
  • 所以我们最终找到了打开连接的位置,然后抛出了 Sql 异常,没有设置“Finally”块来确保连接已关闭。感谢您的文章和帮助。

标签: c# sql-server wcf


【解决方案1】:

为什么这个数字默认为 100,似乎很低。

100 个连接大致意味着您每秒可以处理 200 个 500 毫秒的数据库处理,而不会出现连接不足的情况。这是相当高的。 如果你达到了这个限制,是时候看看优化了。

将其显着提高到 1000 或类似的值有什么负面影响?

Is there a good way to determine what this Max Should be raised to?

粗略地说,它应该是每秒需要的连接数乘以释放每个连接之前所需的平均执行时间。 例如,如果您需要每秒打开 100 个新连接,每个连接都需要 10 秒才能释放(这将非常巨大),那么从长远来看,您的池中需要大约 1000 个连接来处理它。

连接池的“范围”是什么?

我会说它在 AppDomain 上(将检查)

这个池是所有到数据库的连接吗?

连接是基于连接字符串池化的。连接字符串的任何微小差异都会导致不同的池(虽然我不确定它是否区分大小写)

每个连接的“机器/服务器”都有自己的池?

关于你的问题,可能有几件事:

  • 您的应用收到的流量远远超出其处理能力(SQL 分析器应该会对此有所帮助,提高池大小会有所帮助)
  • 您有一些查询需要花费太多时间并且调用过于频繁(需要几秒钟,每秒调用多次)造成瓶颈(分析器也会有所帮助)
  • 您在某些嵌套(递归)循环中泄漏连接或打开太多连接
  • 你有这么多的池,你达到了连接的数据库限制(我的 2008R2 Std Select @@MAX_CONNECTIONS 上的 32767)这似乎不太可能

【讨论】:

  • 所以我们最终找到了打开连接的位置,然后抛出了 Sql 异常,没有设置“Finally”块来确保连接已关闭。感谢您的帮助。
  • @jbl,您确定大多数业务案例都有 100 个连接吗?
  • 在我的例子中,我注意到一些 API 调用被调用了几次/秒(~20-30 次),而它们应该只被调用一次。发生这种情况时我会遇到超时(发送推送通知,所有用户同时打开文章)。我重新启动 SQL 服务器,该站点再次工作。同一秒内的并发请求是否可能导致瓶颈?我知道这不是一个好习惯,但可以通过增加连接池大小来解决这个问题吗?我现在可以对请求进行速率限制,但我想知道我是否很可能因为这些并发调用而超时。有什么建议吗?
  • @RamiZebian 我认为提高连接池不会解决您的问题。连接池耗尽引发了一个显式异常,这使得问题显而易见。您应该针对您的问题提出专门的问题,并提供一些代码。
  • @jbl 我通过实现 OutputCache 解决了这个问题。这大大减少了服务器和 SQL 的负载。现在,无论我在同一个 URL 或 Web 服务上调用 1 次还是 1000 次,SQL 都只执行一次查询。
猜你喜欢
  • 2013-05-31
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多