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

All*_*nde 11 .net ado.net database-connection connection-pooling sql-server-2008

我在这里遇到大麻烦,在我的服务器上.

我在我的服务器上运行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 
Run Code Online (Sandbox Code Playgroud)

我一直在检查我的代码并在每次连接时关闭,我将测试新的类,但我担心问题不会得到解决.

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

任何想法除了检查关闭所有连接后打开使用它们?

已解决(现在我只有一个和"睡眠"状态的美丽连接):

除了David Stratton之外,我想分享一下这个链接,它可以帮助解释它的连接池是如何工作的:http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and. HTML

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

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

Dav*_*vid 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可能有人在那里提供帮助.