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可能有人在那里提供帮助.
| 归档时间: |
|
| 查看次数: |
34376 次 |
| 最近记录: |