【问题标题】:Why does my website constantly freeze?为什么我的网站经常冻结?
【发布时间】:2009-03-28 20:15:25
【问题描述】:

这是一个非常模糊的问题,要得到答案似乎是一个很长的问题,但我不知道还能做什么。

自从我让我的网站时不时地上线以来,它就会冻结。你点击一个链接,浏览器就会在那里看起来像是在尝试连接。似乎冻结可以持续长达 2 分钟左右,然后一切都很好。然后过一会儿,它会做同样的事情。

我在日志文件中跟踪我网站上发生的所有异常。

这些我都懂了。。

超时。操作完成前超时时间已过或服务器没有响应

堆栈跟踪显示它导致某些方法连接到数据库。

我假设冻结与这个超时问题有关。我的网站托管在共享服务器上,而我的数据库位于其他服务器上,其中还有大约十亿个其他数据库。

但即使是在共享服务器上,这种冻结问题也会一直发生。它非常烦人。考虑到我的网站是基于电子商务的并且人们在上面进行交易,我可以看到这是一个非常灾难性的问题。我想要的最后一件事是当我的用户点击“提交付款”按钮时网站冻结,然后由于网站冻结,导致他们一遍又一遍地点击提交付款按钮,然后信用卡被收取大约 10 次额外费用。

有人对最好的处理方法有什么建议吗?

【问题讨论】:

  • 我已经进行了双重和三重检查,以确保我的连接被正确处理并且它们似乎都正常。有趣的是,之前记录的异常已经停止,但冻结仍然存在。我不知道发生了什么。会不会是垃圾收集器介入了?

标签: c# asp.net sql sql-server


【解决方案1】:

我猜它与数据库连接有关。检查他们是否被正确释放?如果没有,那么它将全部用完。

还要检查您的数据库是否配置了连接池。

【讨论】:

【解决方案2】:

超时。操作完成前超时时间已过或服务器没有响应

这是一个 Sql 命令超时异常 - 如果您的数据库负载不足,这可能会有些常见。确保您正在处理 SqlConnections 和 SqlCommands - 尽管这通常会导致池超时异常(无法从连接池中检索连接)。

奇怪的是,有人 正在运行调整不当或以其他方式占用资源的查询。它可能是您的站点,但由于您在共享数据库服务器上,因此它可能很容易成为其他人的站点。它也可能是阻塞的或打开的事务——因为它们会在您的数据库中,这将是一个编码问题。您可能需要让您的托管服务提供商参与来追踪它或转移到专用的数据库服务器。

您可以减少 SqlCommands 的 CommandTimeout - 我知道这听起来有点违反直觉,但我经常发现尽早失败比尝试 60 秒给服务器带来额外负载要好。如果您的 0.5 秒查询没有在 5 秒内完成,那么很有可能也不会在 60 秒内完成。

或者,如果您是患者类型,您可以增加 CommandTimeout - 但如果您增加太多,您需要修改 90 秒的 IIS 超时。

【讨论】:

    【解决方案3】:

    超时错误肯定是页面冻结的根源。当它发生时,页面将在返回错误消息之前等待数据库连接大约一分钟。由于 Web 服务器一次只处理来自每个用户的一个页面,因此整个站点对于用户来说似乎是冻结的,直到出现超时错误。即使它只是偶尔发生在少数用户身上,但对他们来说似乎相当严重,因为他们一分钟左右根本无法访问该网站。

    问题的严重程度取决于您遇到的错误数量。从你的描述看来,你得到的东西太多了,不正常。

    确保您的所有数据读取器、命令对象和连接对象都得到正确处理,这样您就不会让连接保持打开状态。

    还要在日志中查找死锁错误,因为它们可能导致超时。如果您有相互锁定的查询,您可以通过更改它们使用表的顺序来改进它们。

    【讨论】:

      【解决方案4】:

      检查 SQL Server 日志,尤其是死锁。

      如果您打开了多个连接,则其中一个可能正在等待被另一个锁定的行。

      【讨论】:

      • SQL 死锁显示为类似“System.Data.SqlClient.SqlException:事务(进程 ID 73)在锁定资源上与另一个进程死锁,并已被选为死锁受害者。重新运行事务。”
      • 只有当死锁超时时间小于查询或网页超时时间时才会显示死锁错误。通常情况并非如此(至少在我维护的网站上)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2021-08-31
      相关资源
      最近更新 更多