这是一个相当大的、编码非常糟糕的 ASP.NET 网站,我目前负责维护它。我不确定如何解决的一个问题是,在看似随机的时间,实时网站将完全锁定,页面访问正常,但任何涉及数据库的内容都会导致应用程序无限期挂起。
原因似乎是到数据库的开放连接比您对低级别流量网站的预期要多得多。事件监视器显示 150 多个打开的连接,其中大多数具有“.NET SqlClient 数据提供程序”的 Application 值,以及网络服务登录。
一个快速的解决方案是重新启动 SQL Server 服务(我已经回收了 ASP.NET 应用程序池也只是为了确保应用程序放开任何东西,并在存在某种循环过程时阻止任何代码重新尝试打开连接我不知道)。然而,这并不能帮助我解决问题。
该应用程序使用 Microsoft SQLHelper 类,这是一个非常常见的库,因此我相当有信心使用此类的代码将在需要时关闭连接。
但是,我发现了一些未正确关闭的 DataReader。我认为我说 DataReader 可以保持底层连接打开是正确的,即使该连接关闭,因为它是一个连接类(如果我错了,请纠正我)。
奇怪的是,其中一位管理员重新启动了服务器(不是数据库服务器,实际服务器)并且立即,该站点将再次挂起。罪魁祸首还是 150 多个打开的数据库连接。
有没有人有任何诊断技术可以与我分享以找出发生这种情况的地方?
更新: SQL Server 日志文件显示了许多这样的条目 (30+)
2010-10-15 13:28:53.15 spid54 启动数据库“test_db”。
我想知道服务器是否受到攻击者的攻击。这可以解释启动后的许多连接,而且似乎是随机的。
更新:已更改 AutoClose 属性,但仍在寻找解决方案!
更新 2:请参阅我对这个问题的回答以获取解决方案!
最佳答案
更新:
很多很多Starting up database
: 设置 AutoClose
属性(property)到false
: REF
您对 DataReader 的看法是正确的:确保关闭它们。但是,即使连接正确关闭,我也遇到了许多连接失控的问题。连接池似乎没有按预期工作,因为每次回发都创建了一个新的 SqlConnection。为了避免这种看似不需要的重新创建连接,对我的 DAL 采用了单例方法。所以我创建了一个 DataAdapter 并通过它发送我的所有数据请求。虽然有人告诉我这是不明智的,但我没有得到任何支持(并且仍然渴望阅读任何关于此效果的文档/意见:我想变得更好,而不是现状)。如果您愿意,我有一个 DataAdapter 类供您考虑。
如果您使用的是 SQL 2005+,您应该能够使用事件监视器查看每个连接的“详细信息”,它有时会为您提供最后执行的语句。也许这将帮助您将语句追溯到代码中的某个位置。
关于ASP.NET 网站产生了数百个到 SQL Server Express 实例的连接 - 如何识别罪魁祸首?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3942418/