Coldfusion 相当新。在 Windows Server 2016 Datacenter 3 核/12GB RAM 上运行 CF2021。运行 SQL Server 2012(服务器 2012 R2;3 核/12GB RAM)。这些也是虚拟服务器。使用FW/1; MVC。
我编写的代码用于下载大量数据(165,000 行,34 列/标题)。
在我的代码中,我开始了以下行
theFile=GetDirectoryFromPath(getCurrentTemplatePath()) & "newSpreadsheet.xlsx";
这意味着它正在保存到我的服务器上的“视图”文件夹中(没什么大不了的)。然后我使用
spreadsheetAddColumn(.....)
添加标题,并使用 spreadsheetAddRows(theSheet,#rc.myquery#);
从模型视图中提取查询。我的问题是,有太多数据需要下拉,页面因超时错误而出错。我将下载限制为 25k 条记录,提取这组数据大约需要 14 分钟。我需要弄清楚如何获取一个电子表格中的所有记录,我想做的是运行一项计划任务,以便在停机期间运行它,并在人们开始工作时可以随时下载电子表格。有什么想法可以加快速度和/或不让网站超时吗? 如果这是手动请求而不是计划任务,您应该将计划任务问题作为单独的问题发布,以便人们相应地定位他们的答案。
出于安全原因,您永远不应该在可公开访问的文件夹中创建文件。
有两个版本这里的要点。
此代码需要
<cfquery>
数据集,并将在 CF 服务器的临时文件夹中创建一个唯一命名的文件。您可以传入列标题名称列表作为一个参数以及文件名,该文件名将在创建并呈现给用户后使用。您可以删除切换文件扩展名的代码并仅创建 xlsx
文件。我在一个负载极高的金融应用程序中使用了它。当然,我们将数据请求限制为 30k 行。
您面临的更大问题可能更多是数据库问题。当您直接在 SQL Manager 中运行查询时,该数据生成的速度有多快?在执行计划打开的情况下运行该查询。这应该可以帮助您识别查询中的瓶颈。
<cfcomponent output="false" displayname="Spreadsheet Service">
<cffunction name="init" access="public" output="false" returntype="SpreadsheetService">
<cfreturn this />
</cffunction>
<cffunction name="createFromQuery" access="public" output="false" returntype="void">
<cfargument name="data" type="query" required="true" />
<cfargument name="columnnames" type="string" required="false" default=""
hint="Comma-delimited List.">
<cfargument name="downloadName" type="string" required="false" default=""
hint="Final file name sent to the browser." />
<cfargument name="xlsx" type="boolean" required="false" default="false"
hint="File extension is xlsx (true) or xls (false)." />
<cfargument name="excludeHeaderRow" type="boolean" required="false" default="false"
hint="Show or hide the column header row." />
<cfset var config= {
, filename= getTempDirectory() & createUUID()
, columnnames= arguments.columnnames
, excludeHeaderRow= arguments.excludeHeaderRow
, downloadFilename= arguments.downloadName
} />
<cfif arguments.xlsx>
<cfset config.fullname &="xlsx">
<cfif len(config.downloadName) GT 0>
<cfset config.downloadFilename &="xlsx">
</cfif>
<cfelse>
<cfset config.fullname &="xls">
<cfif len(config.downloadName) GT 0>
<cfset config.downloadFilename &="xls">
</cfif>
</cfif>
<cfset config.full_temp_name= config.temp_path & config.temp_name & "." & config.extension />
<cftry>
<cfspreadsheet action="write"
filename="#config.filename#"
columnnames="#arguments.columnnames#"
excludeHeaderRow="#arguments.excludeHeaderRow#"
query="#arguments.data#" />
<cfspreadsheet action="read" src="#config.filename#" name="local.xls" />
<cffile action="delete" file="#config.filename#" />
<cfif len(arguments.downloadName) GT 0>
<cfheader name="content-disposition"
value="attachment; filename=#config.downloadFilename#" />
<cfelse>
<cfheader name="content-disposition" value="attachment; filename=#config.filename#" />
</cfif>
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(local.xls)#"
reset="true" />
<cfcatch type="any">
<cfdump var="#cfcatch#" output="console" />
</cfcatch>
</cftry>
</cffunction>
</cfcomponent>