2

Coldfusion 中更有趣的“功能”之一是它如何处理外部请求。它的基本要点是,当通过<cfquery>或任何其他外部请求对外部源进行查询时,它会将外部请求传递给特定的驱动程序,此时 CF 本身无法暂停它。即使在查询或 cfsetting 中指定了超时,它也会被所有外部请求完全忽略。

http://www.coldfusionmuse.com/index.cfm/2009/6/9/killing.threads

因此,考虑到这一点,我们遇到的问题是我们的 CF 服务器和我们的 mySQL 服务器之间的通信有时会出错并留下挂起的线程。它们具有以下特点。

  1. 挂起的线程出现在 CF 中,无法从 FusionReactor 中杀死。
  2. 在 mySQL中没有可见的挂起线程,也没有活动的运行查询(只是通常的睡眠)。
  3. 数据库正在响应其他调用,并且似乎运行正常。
  4. 数据库和用户都没有达到最大连接数。

在我看来,唯一可能的候选者是 CF 以某种方式发出请求,mySQL 正在响应该请求,但是 CF 忽略了一个答案,并继续保持线程打开等待来自 mySQL 的响应。这可以解释为什么数据库似乎没有任何问题的迹象,但 CF 保持一个线程打开等待神秘的答案。

通常这些挂起的线程会随机出现在其他工作脚本上(例如在新闻文章上发表评论)。即使该脚本挂起一个线程,该脚本的其他请求也会通过,这意味着脚本不一定有错误,而是脚本执行时面临的条件。

我们进行了一些测试以确定这不是 mysql 生成的 max_connections 错误......我们创建了一个用户,给它 1 个最大连接数,将该连接与 sleep(1000) 查询绑定并执行另一个查询。不幸的是,它在没有生成挂起线程的情况下正确地出错了。

所以,我现在完全不知道出了什么问题。是否有其他连接限制或超时可能导致服务器之间的通信出错?

4

3 回答 3

0

您应该开始关注的一件事是两台服务器之间的硬件。您的路由器、网桥或 NIC 可能会偶尔丢弃数据包。这可能会导致 mySQL 框认为它已经完成了任务,而 CF 服务器坐在那里并无限期地等待完整的响应,从而创建一个挂起的线程。

3com 在这里有一些关于丢包测试的详细信息:http: //support.3com.com/infodeli/tools/netmgt/tncsunix/product/091500/c11ploss.htm#22128

于 2010-09-02T11:20:19.910 回答
0

我们在 MS SQL 服务器上遇到了类似的问题。在那里,根本原因是一个已知问题,由于某种原因,服务器认为它正在关闭,并且线程挂起(即使服务器显然没有关闭)。

我们无法消除这个问题,但能够通过关闭池化数据库连接和调整连接刷新率来减少它。(我认为我得到了正确的标签——在我的新工作中无法访问管理员。)两者都在管理员的连接属性中。

请注意:问题不完全在于 CF。显然,这个问题会影响所有 Java 应用程序。无论如何,这并不会减少我对此的恼怒程度。

于 2010-09-02T12:54:43.697 回答
0

长话短说,但我相信原因是由于 Coldfusion 的 CF8 图像处理。它只是越野车,现在在 CF9 中我再也没有看到过这个问题。

于 2011-11-01T04:28:16.313 回答