Coldfusion 中更有趣的“功能”之一是它如何处理外部请求。它的基本要点是,当通过<cfquery>
或任何其他外部请求对外部源进行查询时,它会将外部请求传递给特定的驱动程序,此时 CF 本身无法暂停它。即使在查询或 cfsetting 中指定了超时,它也会被所有外部请求完全忽略。
http://www.coldfusionmuse.com/index.cfm/2009/6/9/killing.threads
因此,考虑到这一点,我们遇到的问题是我们的 CF 服务器和我们的 mySQL 服务器之间的通信有时会出错并留下挂起的线程。它们具有以下特点。
- 挂起的线程出现在 CF 中,无法从 FusionReactor 中杀死。
- 在 mySQL中没有可见的挂起线程,也没有活动的运行查询(只是通常的睡眠)。
- 数据库正在响应其他调用,并且似乎运行正常。
- 数据库和用户都没有达到最大连接数。
在我看来,唯一可能的候选者是 CF 以某种方式发出请求,mySQL 正在响应该请求,但是 CF 忽略了一个答案,并继续保持线程打开等待来自 mySQL 的响应。这可以解释为什么数据库似乎没有任何问题的迹象,但 CF 保持一个线程打开等待神秘的答案。
通常这些挂起的线程会随机出现在其他工作脚本上(例如在新闻文章上发表评论)。即使该脚本挂起一个线程,该脚本的其他请求也会通过,这意味着脚本不一定有错误,而是脚本执行时面临的条件。
我们进行了一些测试以确定这不是 mysql 生成的 max_connections 错误......我们创建了一个用户,给它 1 个最大连接数,将该连接与 sleep(1000) 查询绑定并执行另一个查询。不幸的是,它在没有生成挂起线程的情况下正确地出错了。
所以,我现在完全不知道出了什么问题。是否有其他连接限制或超时可能导致服务器之间的通信出错?