C#: 最大池大小达到的根本原因

3
我们在 WCF 应用程序 中遇到了以下错误:

超时已过期。在从池中获取连接之前,超时时间已经流逝。这可能是因为所有池化的连接都在使用中并且达到了最大池大小。

当我们收到该错误时,应用程序已使用了总共24个连接,我认为默认的连接池大小为100。
我们总是会关闭 SQL 连接 并且也会处理 SQLDataReader
我不确定为什么会发生这种情况。是否有其他情况会导致出现此错误?

所有可丢弃的对象都应该被处理,不仅仅是SqlDataReader,更重要的是SqlConnection。使用_using语句_来处理这些类型的对象,以便正确地处理它们。 - Steve
@Steve - 是的,我们使用 "using" 语句来处理连接和 SQL 命令等。 - Girish
我认为你需要更深入地调查一下你的服务,看看你是否在代码中错过了.Dispose()方法或者using语句。有时候,问题可能仅仅是一个小小的循环引起的。 - Mehdi Souregi
我们需要更多关于你场景的信息:你是否在使用连接池?你正在使用哪个.NET Framework版本? - Ricardo Pontual
@RicardoPontual - 不,我们在连接字符串中不使用显式池大小。 - Girish
显示剩余3条评论
1个回答

3

我有一些建议。

  1. using块内正确实现所有连接,关闭/处理连接(如你所说,这已经完成)
  2. 检查哪些用户/机器正在保持打开的连接。运行此查询以标识数据库id:

select distinct dbid, DB_NAME(dbid) FROM sys.sysprocesses where dbid > 0

然后,使用此查询来检查所有打开的连接,替换dbid

SELECT dbid, DB_NAME(dbid) as DatabaseName, COUNT(dbid) as ConnectionCount, loginame as LoginName
  FROM sys.sysprocesses
 WHERE  dbid = 1
 GROUP BY dbid, loginame
 ORDER BY count(dbid) desc

这可以提示你谁正在保持太多的连接。

  1. 在连接字符串中实现连接池以限制连接数。 在应用程序连接字符串中使用以下内容:

Pooling=true; Min Pool Size=1; Max Pool Size=5

希望这可以帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接