代码之家  ›  专栏  ›  技术社区  ›  Jason

ColdFusion超时错误

  •  3
  • Jason  · 技术社区  · 14 年前

    我有一个每天运行一次的计划任务,它构建一个XML文件,我将其传递给另一个组。最近,数据量大大增加,现在导致任务超时(我想)。我试着尽可能地优化我的脚本,但运气不好。它在一小时前就结束了,我没有任何冷融合错误。相反,我在它运行后得到一个“这个页面找不到”。

    • 除了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!
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   zarko.susnjar    14 年前

    对我来说,这听起来像是记忆问题。可能会发生这样的情况:您的页面填满了专门用于ColdFusion的整个堆空间,然后以几个兆字节的大小“生存”,这些字节在timeuot之前都是用垃圾收集器清理的。 我处理了1GB+XML文件,所以我做了真正的噩梦,直到我弄明白了所有的事情。

    你能做什么?

    1. 确保已启用调试。

    2. 检查原木

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

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

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

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

        2
  •  1
  •   KM.    14 年前

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

    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