原因似乎是对数据库的更多开放连接,而不是对低级别流量网站的期望.活动监视器显示150个打开的连接,大多数具有应用程序值“.NET SqlClient Data Provider”,并具有网络服务登录.
一个快速的解决方案是重新启动SQL Server服务(我还回收了ASP.NET应用程序池,只是为了确保应用程序可以解决任何问题,并阻止任何代码重新尝试打开连接,如果存在某种循环过程我不知道的.但这并不能帮助我解决问题.
该应用程序使用Microsoft SQLHelper类,这是一个非常常见的库,所以我相信使用此类的代码将在需要时关闭连接.
然而,我发现了一些未正确关闭的DataReader.我认为我说对,DataReader可以保持底层连接打开,即使该连接已关闭,因为它是一个连接类(如果我错了,请纠正我).
它所特有的是其中一个管理员重新启动服务器(不是数据库服务器,实际服务器)和immediatley,该站点将再次挂起.罪魁祸首又是150个开放的数据库连接.
有没有人有任何诊断技术,他们可以与我分享,以解决这种情况发生的原因?
更新:SQL Server日志文件显示许多这样的条目(30)
2010-10-15 13:28:53.15 spid54启动数据库’test_db’.
我想知道服务器是否被攻击者击中了.这可以解释启动后的许多连接,以及看似随机的时间.
更新:已更改AutoClose属性,但仍在寻求解决方案!
更新2:请参阅我对该问题的答案以获得解决方案!
更新:大量启动数据库:将AutoClose属性设置为false:REF
您的DataReader是正确的:请确保关闭它们.但是,即使连接正确关闭,我也遇到了许多连接产生失控的问题.连接池似乎没有按预期工作,因为每个post-back都创建了一个新的SqlConnection.为了避免这种看似不必要的重新创建连接,我采用了Singleton方法来处理我的DAL.所以我创建了一个DataAdapter并通过它发送我的所有数据请求.虽然我被告知这是不明智的,但我还没有得到任何支持这个说法(我仍然渴望阅读任何文件/意见:我希望变得更好,而不是现状).我有一个DataAdapter类供您考虑,如果您愿意.
如果您使用的是SQL 2005,则应该能够使用Activity Monitor查看每个连接的“详细信息”,这有时会为您提供最后执行的语句.也许这会帮助您将语句追溯到代码中的某个位置.