【问题标题】:Is there any benefit to wrapping CFTHREAD around database inserts?将 CFTHREAD 包裹在数据库插入周围有什么好处吗?
【发布时间】:2014-07-11 04:39:09
【问题描述】:

我们有几千个目录,其中的页面每天访问量高达 50 万次。在每个页面点击结束时,我们将一些 CGI 变量插入到数据库中。如果提交了表单或执行了搜索,我们会将其中的一些信息插入到另一个数据库中。不需要从这些数据库插入中的每一个返回信息。这些插入发生在页面处理结束时。

我了解到,一旦启动“运行”线程,页面处理就会继续,并且不会等待响应。这似乎会加快页面的完成速度,因为它不等待页面中的查询运行。这是正确的吗?

像这样将这些数据库插入到他们自己的线程中是否有任何好处?

<cffunction
    name="OnRequest"
    access="public"
    returntype="void"
    output="true"
    hint="Fires after pre page processing is complete.">

    <cfargument name="RequestedContent" type="string" required="true" />


    <!--- OUTPUT THE PAGE CONTENT --->
    <cfinclude template="#ARGUMENTS.RequestedContent#" />

    <cfscript>
        thread
            action="run"
            name="Tracking" {
            include "track1.cfm";
            include "track2.cfm";
        }
    </cfscript>

    <cfreturn />
</cffunction>

【问题讨论】:

  • 好处是用户等待 ColdFusion 代码完成处理的时间减少了几毫秒。
  • 设置线程priority="low" 可能会减轻其他人提到的潜在开销问题。

标签: coldfusion coldfusion-10 cfthread


【解决方案1】:

您是正确的,如果您不加入页面中的线程,那么页面将更快完成。在将所有内容发送给用户并关闭 http 连接后,线程可能会完成其执行。

我会说这听起来像是对该功能的合理使用,但我也同意,如果插入花费了这么多时间,您可能想看看您是如何处理数据的。

【讨论】:

    【解决方案2】:

    我会说“不,这样做没有什么好处”。您将为您的用户节省更多的毫秒时间,但您会将 ColdFusion 服务器置于两倍的负载下,这反过来可能会导致全面的性能下降。服务器只有有限数量的线程可用于所有请求,因此将每个请求使用的线程数加倍会使全部使用它们的风险加倍。

    同时启动一个新线程本身也有开销,因此您在这里为用户提供的收益不是线性的。

    如果您的插入查询花费的时间足够长以至于影响了您的用户体验,那么您应该做的是调整这些(在数据库结束时)。

    另外:除非您对该代码已经存在性能瓶颈,否则过早优化它并没有多大意义。

    【讨论】:

      【解决方案3】:

      在每次请求时将数据插入到表中时,可能会出现表锁定问题,因此线程可以潜在地缓解最终用户在可变插入时间的一些差异。我已经看到它在大容量网站上成功使用。然而,正如 Adam 所提到的,线程是有限的,在一个真正需要空闲线程的进程出现死锁问题时,你最终可能会占用你的线程。

      在这种情况下,您可能会考虑在应用程序中排队插入一两分钟,然后在线程中执行批量插入。如果服务器在刷新队列之前崩溃,这显然会带来一些数据丢失的风险,并且需要更多的工作来处理线程安全。但是,如果您不立即需要插入的数据,它可以很好地工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 2013-08-16
        • 1970-01-01
        • 2013-01-07
        相关资源
        最近更新 更多