我有一个计划任务,每天运行一次,构建一个我传递给另一个组的XML文件。最近,数据量大大增加,现在导致任务超时(我认为)。我试图尽可能地优化我的脚本,但没有运气。它在一个小时之前很久就出现了,我没有得到任何类型的ColdFusion错误。相反,我运行后会收到“此页面无法找到”。
文件:
<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!
答案 0 :(得分:3)
对我来说,这听起来像记忆问题。可能会发生这样的情况,即你的页面填满了专用于Coldfusion的整个堆空间,然后“生活”在几兆字节中,用垃圾收集器清理直到timeuot。 我使用1GB + XML文件,所以我做了一个真正的噩梦,直到我弄明白了。
那么你能做什么?
确保已启用调试。
检查日志
打开CF管理员的监控工具,看看运行时会发生什么。 (如果你看不到监视器,请使用任务管理器,看看jrun是否占用了与cfadmin中设置相同的内存量)
您还可以粗略估计xml有多大,例如:行数乘以该XML节点中的平均字符数。如果它太大,这可以帮助你搞清楚。
查看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