代码之家  ›  专栏  ›  技术社区  ›  Owen Allen

是什么导致了Colfusion->mysql通信中的神秘挂线

  •  2
  • Owen Allen  · 技术社区  · 14 年前

    <cfquery> 或者任何其他外部请求,比如它将外部请求传递给特定的驱动程序,此时CF本身无法挂起它。即使在查询或cfsetting中指定了超时,对于所有外部请求,它也会被完全忽略。

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

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

    1. 挂起的线程在mySQL中可见,没有活动的运行查询(只是通常的休眠)。
    2. 尚未达到数据库或用户的最大连接数。

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

    通常

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

    3 回复  |  直到 10 年前
        1
  •  0
  •   Daniel Sellers    14 年前

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

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

        2
  •  0
  •   Ben Doom    14 年前

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

    我们无法消除这个问题,但是可以通过关闭池数据库连接和摆弄连接刷新率来减少这个问题。(我想我的标签是对的——在我的新工作中不能访问administrator。)两者都在administrator中的connection属性中。

        3
  •  0
  •   Owen Allen    13 年前

    长话短说,但我相信原因是由于Coldfusion的CF8图像处理。它只是小车,现在在CF9我从来没有见过这个问题了。

    推荐文章