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) 查询绑定并执行另一个查询。不幸的是,它正确地出错了,但没有生成挂起的线程。

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

有帮助吗?

解决方案 3

长话短说,但我相信这是由于 Coldfusion 的 CF8 图像处理造成的。这只是 bug,现在在 CF9 中我再也没有遇到过这个问题。

其他提示

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

3com 在此处提供了有关丢包测试的一些详细信息: http://support.3com.com/infodeli/tools/netmgt/tncsunix/product/091500/c11ploss.htm#22128

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

我们无法消除该问题,但可以通过关闭池数据库连接并调整连接刷新率来减少该问题。(我想我的标签是正确的——在我的新工作中无法访问管理员。)两者都位于管理员的连接属性中。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top