性能问题:
QAC系统的excel下载时速度非常非常的慢,今天User需要下载445条记录,系统就没反应了,等30分钟都无法正常下载;不过下载200条以下的记录时是ok的。说明是内存或者什么性能上的问题了。
问题解决:
Debug跟了一下程序,发现QAC里导出excel是用最原始的方式,就是用循环把所有信息拼成一个html长字符串,然后就直接output出来了。问题就出现在这循环里了,假如下载500条记录,每条记录50个columns,那么就是循环500*50次,而这2.5万次循环里,之前的程序是用String的“+”操作直接拼字符串的,因为String是final类,每一次“+”操作实际上都是重新new一个String对象,把引用指向新的对象,所以速度非常非常的慢!
于是我把String的“+”操作换成了StringBuffer的append操作,效率提高了好几个等级!!之前30分钟都download不下来的excel文件,现在不到30秒就能下载下来了!
StringBuffer的效率真赞啊~
哈哈,解决了一个长期以来遗留下来的性能问题,好有成就感,哈哈:)
附:
1. 之前的程序(String的“+”操作):
public static void exportHtmlFileToXLS(CachedRowSet crs, String strFilePath, String strEncode) throws SQLException, IOException
{
ResultSetMetaData rsmd = crs.getMetaData();
int numColumn = rsmd.getColumnCount();
String temp = "";
// Build Head of Field Name
temp += "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
temp += "<table border='1'>";
temp += "<tr>";
for (int i = 1; i <= numColumn; i++) {
temp += "<td align='center'>";
temp += rsmd.getColumnName(i);
temp += "</td>";
} // End for
temp += "</tr>";
temp += "<tr>";
if (crs.size() > 0) {
while (crs.next()) {
System.out.println(System.currentTimeMillis());
long time1=System.currentTimeMillis();
for (int i = 1; i <= numColumn; i++) {
temp += "<td align='center'>";
temp += Utility.notNull(crs.getString(rsmd.getColumnName(i))).replaceAll(",", "");
temp += "</td>";
// if(debug) System.out.println("[" + rsmd.getColumnName(i) + "][" + rsmd.getColumnTypeName(i) + "]");
} // End for
temp += "</tr>";
System.out.println(System.currentTimeMillis());
long time2=System.currentTimeMillis();
long time=time2-time1;
System.out.println(time);
} // End while(crs.next())
} // End if(crs.size()>0)
temp += "</table>";
File csvFile = new File(strFilePath);
FileOutputStream fos = new FileOutputStream(csvFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, strEncode);
//System.out.println("encode="+osw.getEncoding());
osw.write(temp);
osw.close();
}
2. 改进后的程序(StringBuffer的append操作):
public static void exportHtmlFileToXLS(CachedRowSet crs, String strFilePath, String strEncode) throws SQLException, IOException
{
ResultSetMetaData rsmd = crs.getMetaData();
int numColumn = rsmd.getColumnCount();
String temp = "";
//modified by linna at 20090622;start;
StringBuffer tempBuf=new StringBuffer();
tempBuf.append("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
tempBuf.append("<table border='1'>");
tempBuf.append("<tr>");
for (int i = 1; i <= numColumn; i++) {
tempBuf.append("<td align='center'>");
tempBuf.append(rsmd.getColumnName(i));
tempBuf.append("</td>");
} // End for
tempBuf.append("</tr>");
tempBuf.append("<tr>");
if (crs.size() > 0) {
while (crs.next()) {
System.out.println(System.currentTimeMillis());
long time1=System.currentTimeMillis();
for (int i = 1; i <= numColumn; i++) {
tempBuf.append("<td align='center'>");
tempBuf.append(Utility.notNull(crs.getString(rsmd.getColumnName(i))).replaceAll(",", ""));
tempBuf.append("</td>");
// if(debug) System.out.println("[" + rsmd.getColumnName(i) + "][" + rsmd.getColumnTypeName(i) + "]");
} // End for
tempBuf.append("</tr>");
System.out.println(System.currentTimeMillis());
long time2=System.currentTimeMillis();
long time=time2-time1;
System.out.println(time);
} // End while(crs.next())
} // End if(crs.size()>0)
tempBuf.append("</table>");
temp=tempBuf.toString();
//modified by linna at 20090622;end;
File csvFile = new File(strFilePath);
FileOutputStream fos = new FileOutputStream(csvFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, strEncode);
//System.out.println("encode="+osw.getEncoding());
osw.write(temp);
osw.close();
}
分享到:
相关推荐
开发者或使用者可以通过查看源代码来学习如何与Excel文件交互,如何实现跨版本的兼容性,以及如何优化数据读取性能。此外,这个升级过程也可以作为一个案例研究,展示在软件维护和升级中的常见挑战和解决方案。对于...
本文将深入探讨Table2Excel.js的原理,以及如何针对IE浏览器进行优化,解决上述问题。 首先,我们来理解Table2Excel.js的工作机制。这个库利用了HTML5的`data:` URL和`navigator.msSaveBlob` API(在IE中特有)来...
总的来说,"Access批量转Excel(支持WIN11)"工具通过自动化和优化Access到Excel的转换过程,解决了数据处理中的痛点。它为IT专业人员和数据分析师提供了便利,使得他们在处理Access数据库时能够更加灵活高效地进行...
- **性能优化**:对于大型Excel文件,可能需要考虑分批读取或缓存策略,避免一次性加载造成内存压力。 - **数据安全**:如果Excel文件包含敏感信息,应确保在转换和存储过程中符合数据安全规范。 - **版本控制**:...
总结来说,"Export2Excel.js"是一个利用JavaScript技术,尤其是Blob对象,将数据导出为Excel文件的解决方案。它可能包含了将数据格式化、创建Blob对象、触发文件下载等一系列步骤。在实际应用中,这个功能可以极大地...
"Excel合并工具.zip" 提供的解决方案正是针对这一需求。这个压缩包包含了一个可以帮助用户快速、方便地合并Excel文件的工具。下面将详细介绍这个工具以及与之相关的Excel合并知识点。 1. Excel文件合并的基本概念:...
在.NET环境中,C#是一种广泛使用的编程语言,用于创建各种应用程序,包括与数据处理相关的任务。本篇文章将详细探讨如何使用C#对Excel文件进行读取、...无论是读取、显示还是保存Excel文件,都有成熟的解决方案来支持。
为了解决这个问题,开源社区推出了一系列专门用于读写Excel的库,其中,`basic_excel`便是其中之一。本文将详细介绍`basic_excel`开源库的最新修正版1.1,以及如何利用它来高效地处理Excel数据。 `basic_excel`是一...
在实际开发中,你可能还会遇到如并发下载、多线程处理、性能优化等问题,都需要结合具体场景进行调整和解决。对于“Excel-Download-master”这个文件名,通常意味着这是一个项目仓库的主分支,包含了完整的代码实现...
你的博客文章可能会详细讨论这些问题以及解决方法,对于遇到相同问题的人来说是非常有价值的参考资料。 至于压缩包中的"export"文件,可能包含了一个实现以上步骤的示例代码,或者是一些必要的资源文件,如CSS样式...
这款软件的版本号SP10_70004974表明它已经更新到了服务打包10,这是一个包含了增强性能和新特性的版本。 EPM(Enterprise Performance Management)是SAP Analysis for Microsoft Excel的核心组件之一,它是企业...
总结,使用JavaScript在前端下载并编辑Excel样式涉及到多个步骤,包括选择合适的库、创建Excel文件、设置样式、转换为Data URL以及考虑兼容性问题。通过理解这些概念和实践,开发者可以构建出功能丰富的前端Excel...
为了解决这些问题,可以考虑分批处理数据,或者使用服务端来生成Excel文件。此外,对于兼容性问题,可以使用polyfill或寻找替代方案,如使用`FileSaver.js`库来处理文件保存。 总结起来,`Export2Excel.js`和`Blob....
"Laravel开发-excel-generator"项目专注于为Laravel 5提供一个简单的解决方案,帮助开发者快速实现这个功能。下面我们将深入探讨相关知识点。 首先,我们了解Laravel。Laravel是PHP的一个现代、优雅的开源Web应用...
在开发过程中,确保你的数据来源和Vue应用在同一域名下,或者使用CORS等手段解决跨域问题。 此外,对于大数据量的导出,你可能需要考虑性能优化,比如分批导出,或者在服务端生成Excel文件并提供下载链接。同时,...
6. **安全与性能优化**: 在实现Excel下载时,应考虑性能和安全问题。例如,避免一次性加载大量数据导致内存溢出,可以分批处理数据。另外,限制下载频率和大小,防止恶意用户滥用服务。对于敏感数据,需要确保它们在...
同时,开发者也可以根据实际需求对其进行二次开发,例如添加自定义样式到导出的Excel文件,或者处理大量数据时优化性能。 总的来说,jQuery.table2excel是一个实用的工具,对于需要快速实现表格数据导出功能的...
ASP.NET是一种基于.NET框架的服务器端编程模型,用于构建动态Web应用程序。在B/S(Browser/Server)架构中,它提供了强大的...在实际应用中,还需要注意性能优化、错误处理和安全性问题,确保服务的稳定性和用户体验。
- 大数据量:对于非常大的表格,由于内存限制,可能会出现性能问题。可以考虑分批导出,或者寻找更专业的数据导出解决方案。 总之,“jquery.table2excel.js”为开发者提供了一种简单而实用的手段,将网页中的HTML...
当需要将JSON格式的数据导出为Excel文件时,纯JavaScript解决方案就显得尤为重要,因为这可以避免依赖服务器端处理或者第三方库。"纯js-json导出excel"的实践就是这样一个例子,它允许开发者直接在客户端将JSON数据...