1

编辑:我更改了名称,因为有一个类似的 SO 问题How do I fix SpreadSheetAddRows function crashing when adding a large query? 那里描述了我的问题,所以我用更简洁的措辞...问题是我的查询结果的电子表格地址以我认为中等大小(1600 行,27 列)轰炸了整个服务器,但这听起来比他的 18,000 行少得多

我正在使用通过 Coldfusion 9.0.1 cfstoredproc 访问的 Oracle 存储过程,该过程在完成时会创建一个电子表格供用户下载

问题是大于 1200 行的结果集返回 500 内部服务器错误,700 行返回正常,所以我猜这是内存问题?

除了标准coldfusion外观中的500 Internal server error之外,我收到的唯一消息是小字体“超出gc开销限制”,并且仅在页面刷新时出现一次,它指的是底层Java JVM

我什至不知道如何诊断这个

这是 cfstoredproc 和电子表格 obj 的结尾

 <!--- variables assigned correctly above --->
 <cfprocresult name="RC1"> 
 </cfstoredproc>

 <cfset sObj = spreadsheetNew("reconcile","yes")>
 <cfset SpreadsheetAddRow(sObj, "Column_1, ... , Column27")>

 <cfset SpreadsheetFormatRow(sObj, {bold=TRUE, alignment="center"}, 1)>

 <cfset spreadsheetAddRows(sObj, RC1)>
    <cfheader name="content-disposition" value="attachment; filename=report_#Dateformat(NOW(),"MMDDYYYY")#.xlsx">
 <cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" variable="#spreadsheetReadBinary(sObj)#">
4

1 回答 1

0

我的答案在于冷融合和一个简单的事实:不要使用 SpreadsheetAddRows 或任何相关函数,如 SpreadsheetFormatRows

我对此的解决方案是执行查询,创建一个 xls 文件,使用标签 cfspreadsheet 写入新创建的 xls 文件,然后服务到浏览器,服务后删除

使用 SpreadsheetAddRows,运行时间从 1000+ 行上的崩溃服务器开始,700 行上的 5+分钟使用上面概述的方法 1-1.5 秒

如果您对更多代码感兴趣,我可以提供评论,我正在使用冷箱框架,所以不认为具体性只会有助于新的工作流程

于 2013-04-11T19:05:05.337 回答