And*_*nda 4 sql-server asp.net connection-pooling
晚上好!
我仍然怀疑asp.net 连接池。我处理的应用程序有时会抛出异常“已达到最大池大小”。
我的团队一遍又一遍地寻找一些泄漏的代码,但什么也没找到。
但是,现在我的怀疑来了。当它说“已达到最大池大小”时,是否意味着已达到数据库或服务器的最大池大小?
If SQL Server hosts several databases for several differents asp.net applications, can these others databases interfere in my database (my database is in the same SQL Server). E.g., if there is some application leaking connection, can this leaking generates "max pool size" in my application?
Thanks!
ADO.NET 为每个连接字符串维护单独的连接池组。因此,如果您有多个数据库,它们应该有自己的池,并且这些池不应相互干扰。
有些请求是否可能需要很长时间?如果一次针对单个数据库执行了足够多的请求,并且它们被延迟,那么连接池可能真的只是因为打开的连接而被访问。
要验证情况并非如此,您可以通过执行sp_who或运行 SQL Server Activity Monitor来检查数据库上正在运行的内容。
您还可以查询数据库中的 DMV 以查看各种程序打开的数据库连接数:
select
NULL as [Connections by Database],
[host_name] as [Client Machine],
DB.name as [Database],
[program_name] as [Client Program],
COUNT(*) as [Open Connections]
from sys.dm_exec_sessions s (nolock)
left join sys.dm_exec_requests r (nolock)
on r.session_id = s.session_id
left join sys.databases DB (nolock)
on DB.database_id = r.database_id
where s.session_id >= 50 -- Ignore SQL Server processes
group by [host_name], DB.name, [program_name]
order by [Client Machine], [Database], [Client Program]
Run Code Online (Sandbox Code Playgroud)
如果您确实发现您只需要更多连接,您可以通过将 Max Pool Size 属性设置为 100 以外的值来调整连接字符串中的限制。这是一个示例。
如果您想查看导致问题的池,可以在调试堆中挖掘 .NET 对象。您必须捕获 w3wp.exe 进程的内存转储,并使用 WinDbg(或可能的Debug Diagnostics Tool)之类的工具对其进行分析。我过去曾这样做过。这不一定很容易,但它可以提供很多帮助。
编辑
ADO.NET 连接池有一个perfmon 计数器,可用于监视泄漏的连接。在性能监视器中,cxpand .NET Data Provider for SqlServer 并添加计数器 NumberOfReclaimedConnections。根据文档,这个计数器意味着:
在应用程序未调用 Close 或 Dispose 的情况下,已通过垃圾回收回收的连接数。不明确关闭或处理连接会损害性能。
我们已经使用这个计数器来验证我们的应用程序是否存在连接泄漏。
| 归档时间: |
|
| 查看次数: |
3057 次 |
| 最近记录: |