【问题标题】:ColdFusion Timeout ErrorColdFusion 超时错误
【发布时间】:2010-05-06 03:29:38
【问题描述】:

我有一个每天运行一次的计划任务,它构建了一个我传递给另一个组的 XML 文件。最近数据量大大增加,现在导致任务超时(我认为)。我试图尽可能优化我的脚本,但没有运气。它在一个小时前超时,我没有收到任何类型的 ColdFusion 错误。相反,我在运行后收到“找不到此页面”。

  • 这可能是 Coldfusion 以外的其他地方的超时吗?
  • 有没有更有效的方法来构建这个 XML 文件?

文件:

<cfsetting requesttimeout="7200">
<cftry>
    <cfquery datasource="datasource" name="getPeople">
        select PersonID, FirstName, LastName
        from People
    </cfquery>
    <cfquery datasource="datasource" name="getDepartments">
        select d.DepartmentID, DepartmentName, pd.PersonID
        from Department d inner join PersonDepartment pd on d.DepartmentID = pd.DepartmentID
    </cfquery>
    <cfquery datasource="datasource" name="getPapers">
        select PaperID, PaperTitle, PaperDescription, pp.PersonID
        from Paper p inner join PersonPaper pp on p.PaperID = pp.PaperID
    </cfquery>
<cfsavecontent variable="theXML"><?xml version="1.0" encoding="utf-8" ?><people>
<cfoutput query="getPeople"><cfsilent>
        <cfquery dbtype="query" name="getPersonDepartments">
        select DepartmentID, DepartmentName
        from getDepartments
        where PersonID = #getPeople.PersonID#
        </cfquery>
        <cfquery dbtype="query" name="getPersonPapers">
        select PaperID, PaperDescription
        from getpapers
        where PersonID = #getPeople.PersonID#
        </cfquery>
        </cfsilent> <person>
        <person_id>
            #getPeople.PersonID#
        </faculty_id>
        <person_first_name>
            #getPeople.Firstname#
        </person_first_name>
        <person_last_name>
            #getPeople.LastName#
        </person_last_name><cfif getPersonDepartments.recordcount gt 0>
        <departments><cfloop query="getPersonDepartments">
            <department>
                <department_id>
                    #getPersonDepartments.DepartmentID#
                </department_id>
                <department_name>
                    #getPersonDepartments.DepartmentName#
                </department_name>
            </department></cfloop>
        </departments></cfif><cfif getPersonPapers.recordcount gt 0>
        <papers><cfloop query="getPersonPapers">
            <paper>
                <paper_id>
                    #getPersonPapers.PaperID#
                </paper_id>
                <paper_description>
                    #getPersonPapers.PaperDescription#
                </paper_description>
            </paper></cfloop>
        </papers></cfif>
    </person>
</cfoutput></faculty>
</cfsavecontent>
<!--- Generate the file that contains the RSS --->
<cffile action="write" file="#application.serverroot#/People.xml" output="#theXml#" nameconflict="overwrite">
<cfcatch>
<cfdump var="#cfcatch#">
</cfcatch>
</cftry>
Done!

【问题讨论】:

  • 我会添加一些时间来查看您的大部分时间都花在了哪里。如果您将 85% 的时间花在查询查询上,那么优化原始数据库查询毫无意义。最简单的方法是使用 getTickCount() 创建一个计时器并记录它或使用 CFFLUSH 将其返回给客户端。
  • 还没有。我正在尝试与我们的管理员合作以获得适当的访问权限,以便我可以提出您的一些建议
  • 嘿,完全没有必要做这些事情......例如,您可以将写入文件更改为正常输出,使用不带 cfsavecontent 的 cfflush,如果它变得太长,那么我们就在右边追踪。我认为最重要的是找到真正的原因,是内存还是数据库或其他什么。

标签: xml sql-server-2005 coldfusion timeout


【解决方案1】:

对我来说,这听起来像是记忆问题。您的页面可能会填满专用于 Coldfusion 的整个堆空间,然后以几兆字节“存在”,这些空间会被垃圾收集器清理直到超时。 我使用了超过 1GB 的 XML 文件,所以在弄清楚一切之前,我真的是做噩梦。

那么你能做什么呢?

  1. 确保调试已关闭。

  2. 查看日志

  3. 打开 CF Admin 的 Monitor 工具,看看运行它时会发生什么。 (如果看不到监视器,请使用任务管理器,看看 jrun 是否像 cfadmin 中设置的那样占用相同数量的内存)

  4. 您还可以粗略估计您的 xml 有多大,例如该 XML 节点中按平均字符数计算的行数。如果它太大,这可以帮助你弄清楚。

查看 Charlie Arehart 的工具列表,这些工具可以帮助您解决这个问题和其他问题 http://www.carehart.org/cf411/

还有其他构建 XML 的方法可以节省内存和/或处理时间。但我们首先要弄清楚问题出在哪里。

【讨论】:

  • 我不得不逐行编写 XML 文件,而不是将整个内容保存在内存中并立即写入。
【解决方案2】:

运行此(在您的计划任务运行时)以查看是否有任何东西锁定/阻止它:

SELECT
    r.session_id AS spid
        ,r.cpu_time,r.reads,r.writes,r.logical_reads 
        ,r.blocking_session_id AS BlockingSPID
        ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
        ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
        ,s.program_name
        ,s.login_name
        ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
        ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
                                                                  WHEN -1 THEN DATALENGTH(st.text)
                                                                  ELSE r.statement_end_offset
                                                              END - r.statement_start_offset
                                                             )/2
                                                           ) + 1
                  ) AS SQLText
    FROM sys.dm_exec_requests                          r
        JOIN sys.dm_exec_sessions                      s ON r.session_id = s.session_id
        CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
    WHERE r.session_id!=@@SPID

【讨论】:

  • 很好的查询 :) 我以后一定会使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多