4

我们有几千个目录,其页面每天被访问多达 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>
4

3 回答 3

3

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

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

于 2014-07-10T18:19:26.480 回答
2

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

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

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

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

于 2014-07-10T18:02:04.463 回答
2

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

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

于 2014-07-10T20:39:09.233 回答