超过100个连接到处于“休眠”状态的sql server 2008

时间:2011-09-26 20:53:46

标签: .net sql-server-2008 ado.net database-connection connection-pooling

我在这里遇到了很大的麻烦,在我的服务器上。

我的服务器上运行了ASP .net web(framework 4.x),所有事务/ select / update / insert都是用ADO.NET创建的。

问题是,在使用一段时间后(一些更新/选择/插入)有时候我在使用此查询检查sql server上的连接时,在“休眠”状态下有超过100个连接:

SELECT 
 spid,
 a.status,
 hostname,  
 program_name,
 cmd,
 cpu,
  physical_io,
  blocked,
  b.name,
  loginame
FROM   
  master.dbo.sysprocesses  a INNER JOIN
  master.dbo.sysdatabases b  ON
    a.dbid = b.dbid where program_name like '%TMS%'
ORDER BY spid 

我一直在检查我的代码并在每次建立连接时关闭,我要测试新课程,但我担心问题不会得到解决。

它假设连接池,保持连接重用它们,但直到我看到不再重复使用它们。

除了检查关闭所有连接后使用它们还有什么想法吗?

已解决(现在我只有一个关于“睡眠”状态的漂亮连接):

除了 David Stratton 之外,我想分享这个链接,以帮助解释连接池的工作原理: http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and.html

简而言之,您需要关闭每个连接(sql连接对象),以便连接池可以重用连接并使用相同的connectinos字符串,以确保强烈建议使用其中一个webConfig。

小心dataReader你应该关闭它的连接(这是让我生气的原因)。

1 个答案:

答案 0 :(得分:17)

听起来好像是连接池。

从这里开始:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  

为每个唯一连接字符串创建连接池。当一个   创建池,创建并添加多个连接对象   池,以满足最小池大小要求。   根据需要将连接添加到池中,直到最大池   指定的大小(默认值为100)。连接被释放回来   在关闭或处置时进入游泳池。

为确保您不创建不必要的池,请确保每次连接时都使用完全相同的连接字符串 - 将其存储在.config文件中。

如果愿意,您还可以减少最大池大小。

实际上,我建议您阅读上面链接的整篇文章。它讨论了清除池,并为您提供了正确使用池的最佳实践。

编辑 - 第二天添加

由于连接池的工作原理,服务器上的池就在那里。根据上面链接的文档:

  

连接池在拥有后从池中删除连接   已经空闲了很长时间,或者如果小便者检测到了   与服务器的连接已被切断。注意切断了   只有在尝试与之通信后才能检测到连接   服务器。如果找到不再连接的连接   服务器,它被标记为无效。删除了无效的连接   仅在连接池关闭或回收时才从连接池中获取。

这意味着服务器本身最终会清理这些池,如果它们仍未使用的话。如果没有清理,l这意味着服务器认为连接仍在使用中,并且挂在它们上以提高性能。

换句话说,除非你发现问题,否则我不会担心。连接池正好应该发生。

如果您真的想要根据文档再次清除池:

  

清除资讯池

     

ADO.NET 2.0引入了两种新方法   清除池:ClearAllPools和ClearPool。 ClearAllPools清除了   给定提供程序的连接池,ClearPool清除   与特定连接关联的连接池。如果   他们是在通话时使用的连接   适当标记。当它们关闭时,它们会被丢弃   回到游泳池。

但是,如果要调整池,可以修改连接字符串。请参阅此页面,并搜索“pool”一词:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

或者您可以登记DBA来协助和设置服务器级别的池。这是偏离主题的,但ServerFault.com可能有人在那里提供帮助。