我在这里遇到了很大的麻烦,在我的服务器上。
我的服务器上运行了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你应该关闭它的连接(这是让我生气的原因)。
答案 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可能有人在那里提供帮助。