围绕数据库插入包装CFTHREAD有什么好处吗?

时间:2014-07-10 15:54:08

标签: coldfusion coldfusion-10 cfthread

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

我读过一次" run"线程启动页面处理继续,并且不等待响应。这似乎会加快页面的完整,因为它不会等待页面中的查询运行。这是对的吗?

将这些数据库插入这样插入自己的线程有什么好处吗?

<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>

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

我会说&#34;不,这样做有一点好处&#34;。您可以将用户保存几毫秒,但是您将ColdFusion服务器的负载降低了两倍,这反过来又可能导致全面性能下降。服务器只有可用于所有请求的有限数量的线程,因此将每个请求使用的数量加倍会使使用它们的风险增加一倍。

同时启动新主题本身也有开销,因此您在此处为用户提供的收益不会是线性的。

如果您的插入查询花费的时间足以影响您的用户体验,那么您应该做的就是调整那些(在数据库末端)。

另外:除非你的代码已经存在性能瓶颈,否则过早优化它并不是很重要。

答案 2 :(得分:2)

在每个请求中将数据插入表时可能存在表锁定问题,因此线程可以为该变量插入时间缓解一些与最终用户的差异。我已经看到这在大量网站上成功使用。但是,正如Adam提到的那样,线程是有限的,无论如何,在一个真正需要自由线程的进程的死锁问题中,你最终可能会占用你的线程。

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