FileOutputStream fo = null;
BufferedReader in = null;
FileOutputStream f = null;
ZipOutputStream zipout = null;
FileInputStream inStream = null;
ServletOutputStream outStream = null;
HttpServletResponse response = request.getResponse();
try {
response.setContentType("text/plain;charset=GB2312");
if (export.equals("txt")) {
response.setHeader("Content-disposition",
"attachment; filename="
+ new String("Query".getBytes("UTF-8"),
"iso8859-1") + ".zip"); //导出zip压缩文件
} else {
response.setHeader("Content-disposition",
"attachment; filename="
+ new String("Query".getBytes("UTF-8"),
"iso8859-1") + ".zip");
}
outStream = response.getOutputStream();
CheckedOutputStream ch = new CheckedOutputStream(outStream,
new CRC32());
zipout = new ZipOutputStream(new BufferedOutputStream(ch)); //把数据经过压缩直接写到response里面,避免中间文件生成,提高效率
if (export.equals("txt")) { //压缩包文件格式
zipout.putNextEntry(new ZipEntry("Query.txt"));
}else{
zipout.putNextEntry(new ZipEntry("Query.xls"));
}
int pageSize = endIndex > 100000 ? 100000 : endIndex;
if (endIndex == 1) {
endIndex = 2;
}
for (int i = startIndex; i < endIndex; i += pageSize) { //对于大数据量的导出,采取分批查询的方式,这里每次查询取100000条记录
paraMap.put("startIndex", i);
paraMap.put("endIndex", i + pageSize - 1);
doExport(paraMap, zipout); //在这个函数中把从数据库查询出来的数据直接写到zipoutStream输出流中,
zipout.flush();
outStream.flush(); //每100000条就把response缓冲区数据推送到客户端,response可以使用flush将数据库缓存到客户端,减少服务器端内存压力,
}
zipout.close();
outStream.close(); //关闭response
} catch (Exception e) {
// e.printStackTrace();
} finally {
}
对于大数据量导出,主要采取几种方案:
1.分批查询数据库,如果数据量上百万,如果一次性读出来,会严重影响服务器性能,增加服务器内存压力,分批导出,分批处理,可以使内存使用比较平稳,不会一次性占用大量内存。
2.压缩处理,导出的数据经过压缩直接写到response里面,一般的文本压缩率非常高,压缩后的文件会小很多,而且也不要先把数据写到临时文件,再做压缩,直接压缩写到response即可。
doExport(paraMap, zipout); //在这个函数中把从数据库查询出来的数据直接写到zipoutStream输出流中,这里往zipout写要这样,zipout.write("hello".getBytes());,要以字节流写到zipoutstream中。
3. zipout.flush();
outStream.flush(); //每100000条就把response缓冲区数据推送到客户端,response可以使用flush将数据库缓存到客户端,减少服务器端内存压力,
分批查询数据库把数据写到response时要用flush,将数据缓冲到客户端,这样有两个好处;一是可以把数据推送到客户端,减少服务器端内存压力,避免影响服务器性能;二是如果本次请求需要查询出几百万的数据,如果不flush,那么服务器端的本次请求仍然会去数据库查询这几百万的数据,这会严重的影响服务器端的性能,从数据库查询出这几百万的数据,而客户端已经取消了本次请求,这样就不能再让服务器继续处理下去,使用flush可以检测客户端的请求是否还存在,不存在会抛出异常,用flush可以捕获到该异常及时中止本次请求,不再去查询数据库,不再处理本次请求。
分享到:
相关推荐
"plsql大数据量导出工具"是专为解决这类问题而设计的工具,它能有效地从Oracle数据库中导出大规模数据,并将其保存为CSV格式,这种格式在数据交换、分析和存储方面广泛使用。 1. **SQL*Loader(SQLULDR2)详解**: ...
- SQL数据库:大部分SQL数据库支持导出查询结果为CSV,如MySQL的`SELECT ... INTO OUTFILE`语句。 - 编程语言:Python、Java、R、Ruby等编程语言都有库或内置函数支持CSV文件的读写,如Python的`pandas`库和`csv`...
在提供的压缩包文件中,"cad文本导出.lst"和"cad文本导出.txt"可能就是导出的文本文件结果。".lst"文件通常用于存储列表或日志信息,而".txt"是纯文本文件,它们可能包含了从CAD图纸中提取的文本数据。用户可以使用...
脚本通过`mysql_connect`连接到数据库,`mysql_select_db`选择需要操作的数据库,`mysql_query`执行SQL查询获取所有表的数据,然后将结果逐行写入文本文件。为了处理可能存在的换行符问题,使用`str_replace`函数...
如果数据量大,可能需要考虑性能优化,例如批量写入数据或使用流式写入。 步骤6:写入PDF 使用`PdfWriter`类将PDF文档写入文件,提供一个输出流指向目标文件。在写入过程中,可以调用`Document`的`add()`方法将表格...
标题中的“itext导出大数据量pdf”是指使用iText这个Java库来处理大量数据并将其转换成PDF格式的文档。iText是一个流行的开源库,主要用于创建和修改PDF文档,适用于各种业务场景,如报表、发票、证书等的生成。 在...
可以把oracle中大量数据导出为txt格式,便于在线下载、存储等后续处理。已经测试过,可以执行。
- **数据量大**:如果查询结果数据量巨大,可能会导致文件过大,这时可以考虑分批导出,或者使用其他数据库工具进行导出。 通过学习这个主题,你可以更高效地管理和处理SQL查询结果,尤其是在没有图形化界面的环境...
为了从数据库获取数据,我们需要使用JDBC连接,执行SQL查询并获取结果集。遍历结果集,将每行数据转换为表格的行,然后添加到表格中。 考虑到大量数据的处理,性能优化是必要的。可以批量插入数据到表格,而不是...
2. **数据导入Hive**:创建一个Hive外部表,该表与HBase表结构对应,然后使用`LOAD DATA`命令将HBase查询结果导入Hive。这一步需要配置HBase与Hive之间的连接,例如通过设置`hbase-site.xml`和`core-site.xml`的属性...
这是因为这些库在内存中构建整个工作簿模型,当数据量过大时,所需内存会迅速增加,可能导致Java虚拟机(JVM)崩溃。为了解决这个问题,可以采取分批导出策略。 分批导出是指将大数据集分割成若干小块,逐批处理和...
在Java世界里,它也被广泛用于生成静态文档或处理数据导出任务,比如Excel文件的生成。本篇文章将详细探讨如何使用Freemarker来实现Excel导出功能,并通过实际例子加深理解。 一、Freemarker基础 1. 模板语言:...
- 使用如JExcelApi、OpenCSV等其他第三方库,它们可能提供了更优化的数据导出方案,尤其是针对大数据量。 7. **优化Excel文件格式**: - 如果可能,可以考虑使用CSV格式代替Excel,因为CSV文件对内存的需求较低,...
2. **控制最大导出量**:如果数据量过大,可以设置每次导出的最大数量,超过则分批导出,避免一次性加载过多数据。 3. **直接 IO 写入**:从数据库获取数据后,直接使用 IO 操作写入文件,避免中间集合类的内存消耗...
WinCC在生产过程中能够收集大量数据,当这些数据需要存档或分析时,通常需要将数据导出到文件中,以便于进一步处理或记录。本文将详细介绍如何将WinCC中的历史数据导出到Excel CSV文件中。 首先,要理解的是,从...
综合以上,这个案例涵盖了SSH框架的综合应用,包括数据交换与报表(Excel导入导出)、用户界面增强(ueditor)、数据可视化(highcharts)以及大数据量文本处理(CLOB)。这样的案例对于提升开发者在企业级Java Web...
Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...