ColdFusion超时错误

时间:2010-05-05 17:34:08

标签: xml sql-server-2005 coldfusion timeout

我有一个计划任务,每天运行一次,构建一个我传递给另一个组的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!

2 个答案:

答案 0 :(得分:3)

对我来说,这听起来像记忆问题。可能会发生这样的情况,即你的页面填满了专用于Coldfusion的整个堆空间,然后“生活”在几兆字节中,用垃圾收集器清理直到timeuot。 我使用1GB + XML文件,所以我做了一个真正的噩梦,直到​​我弄明白了。

那么你能做什么?

  1. 确保已启用调试。

  2. 检查日志

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

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

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

    还有其他方法可以构建可以节省内存和/或处理时间的XML。但让我们首先找出问题所在。

答案 1 :(得分:1)

运行此命令(当您的计划任务正在运行时)以查看是否有任何内容锁定/阻止它:

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