我有一个 C# Framework 4.0 的应用程序。像许多应用程序一样,这个应用程序连接到数据库以获取信息。在我的例子中,这个数据库是 SqlServer 2008 Express。
数据库在我的机器上
在我的数据层中我使用 Enterprise Library 5.0
当我在本地机器上发布我的应用程序时(App Pool Classic)
Windows 专业版
IIS 7.5
应用程序运行良好。我在测试应用程序时使用此查询来检查应用程序创建的连接数。
SELECT db_name(dbid) as DatabaseName, count(dbid) as NoOfConnections,
loginame as LoginName
FROM sys.sysprocesses
WHERE dbid > 0 AND db_name(dbid) = 'MyDataBase'
GROUP BY dbid, loginame
当我开始测试时,连接数开始增加,但某个时候最大连接数是 26。我认为这没问题,因为应用程序可以运行
当我将应用程序发布到 TestMachine1 时
• XP 模式虚拟机 (Windows XP Professional)
• IIS 5.1
它运行良好,行为是一样的,数据库的连接数增加到 24 或 26,之后无论我在应用程序中做什么,它们都会停留在那个点。
问题:
当我发布到 TestMachine2 (App Pool Classic) 时
• Windows Server 2008 R2
• IIS 7.5
我开始测试应用程序,数据库的连接数量开始增长,但是这次它们增长非常迅速,并没有在 24 或 26 时停止增长,连接数量一直增长到 100,应用程序在那时停止工作。
我检查了出版物上的任何差异,特别是 Windows Professional 和 Windows Server,它们似乎具有相同的参数和配置。
有任何线索可以解释为什么会发生这种情况吗?有什么建议吗?
答案1
听起来你需要查看你的代码来找出连接在哪里被打开而不是关闭。
答案2
我同意其他答案,听起来你没有在某处处置连接(或命令或其他一次性资源)。
使用分析器是个好主意。
仔细检查代码,只寻找可能未处置的资源是可行的。(经过三次审查,它对我们有用)。
在测试时,我建议将pooling = false添加到连接字符串中。这样,当你的应用程序关闭连接时,它就会真正关闭,而不是根据池算法的判断而徘徊。
答案3
使用在服务器复本上运行的内存分析器来找出未释放的连接对象生成的位置。修复代码。要点。我在稍大一点的场景中也遇到了同样的问题(几分钟内有 8000 多个连接)。对我有帮助。
我现在使用http://memprofiler.com/广泛地 - 可能是最好的内存分析器,也是我所知道的唯一一个具有单元测试 API 的分析器;)