Xml ColdFusion超时错误

Xml ColdFusion超时错误,xml,sql-server-2005,coldfusion,timeout,Xml,Sql Server 2005,Coldfusion,Timeout,我有一个每天运行一次的计划任务,该任务构建一个XML文件,并传递给另一个组。最近,数据量大幅增加,我认为现在导致任务超时。我试图尽可能地优化我的脚本,但没有成功。它在一个小时前就超时了,我没有收到任何类型的ColdFusion错误。相反,我得到了一个错误消息,该页面在运行后无法找到 这是不是在Coldfusion之外的某个地方超时了? 有没有更有效的方法来构建这个XML文件? 文件: 在计划任务运行时运行此命令,查看是否有任何内容正在锁定/阻止它: SELECT r.session_id

我有一个每天运行一次的计划任务,该任务构建一个XML文件,并传递给另一个组。最近,数据量大幅增加,我认为现在导致任务超时。我试图尽可能地优化我的脚本,但没有成功。它在一个小时前就超时了,我没有收到任何类型的ColdFusion错误。相反,我得到了一个错误消息,该页面在运行后无法找到

这是不是在Coldfusion之外的某个地方超时了? 有没有更有效的方法来构建这个XML文件? 文件:


在计划任务运行时运行此命令,查看是否有任何内容正在锁定/阻止它:

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

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

那你能做什么呢

确保调试已关闭

检查日志

打开CF管理员的监视工具,看看运行此工具时会发生什么。 若你们看不到监视器,那个么使用任务管理器,看看jrun是否占用了和cfadmin中设置的相同的内存量

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

查看Charlie Arehart的工具列表,这些工具可以帮助您解决此问题和其他问题


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

我会增加一些时间,看看你的大部分时间都花在了哪里。如果您将85%的时间花在查询上,那么优化原始DB查询是没有意义的。最简单的方法是使用getTickCount创建一个计时器,并记录它或使用CFFLUSH将它返回给客户机。我正试图与我们的管理员合作,以获得适当的访问权限,这样我就可以执行您的一些建议。嘿,实际上没有必要执行这些操作。。。例如,您可以使用不带cfsavecontent的cfflush将文件写入更改为正常输出,如果写入时间过长,则说明我们的思路是正确的。我认为最重要的是找到真正的原因,是内存、数据库还是其他什么。很好的查询:我将来肯定会使用它。我必须逐行编写XML文件,而不是将整个文件保存在内存中并立即编写。
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