`

大数据量查询结果的文本导出

    博客分类:
  • java
F# 
阅读更多
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可以捕获到该异常及时中止本次请求,不再去查询数据库,不再处理本次请求。

1
2
分享到:
评论

相关推荐

    plsql大数据量导出工具

    "plsql大数据量导出工具"是专为解决这类问题而设计的工具,它能有效地从Oracle数据库中导出大规模数据,并将其保存为CSV格式,这种格式在数据交换、分析和存储方面广泛使用。 1. **SQL*Loader(SQLULDR2)详解**: ...

    csv导出大量数据

    - SQL数据库:大部分SQL数据库支持导出查询结果为CSV,如MySQL的`SELECT ... INTO OUTFILE`语句。 - 编程语言:Python、Java、R、Ruby等编程语言都有库或内置函数支持CSV文件的读写,如Python的`pandas`库和`csv`...

    cad文本导出工具

    在提供的压缩包文件中,"cad文本导出.lst"和"cad文本导出.txt"可能就是导出的文本文件结果。".lst"文件通常用于存储列表或日志信息,而".txt"是纯文本文件,它们可能包含了从CAD图纸中提取的文本数据。用户可以使用...

    从MySQL导入导出大量数据的程序实现方法

    脚本通过`mysql_connect`连接到数据库,`mysql_select_db`选择需要操作的数据库,`mysql_query`执行SQL查询获取所有表的数据,然后将结果逐行写入文本文件。为了处理可能存在的换行符问题,使用`str_replace`函数...

    利用itext操作pdf从数据库导出大量数据

    如果数据量大,可能需要考虑性能优化,例如批量写入数据或使用流式写入。 步骤6:写入PDF 使用`PdfWriter`类将PDF文档写入文件,提供一个输出流指向目标文件。在写入过程中,可以调用`Document`的`add()`方法将表格...

    itext导出大数据量pdf

    标题中的“itext导出大数据量pdf”是指使用iText这个Java库来处理大量数据并将其转换成PDF格式的文档。iText是一个流行的开源库,主要用于创建和修改PDF文档,适用于各种业务场景,如报表、发票、证书等的生成。 在...

    Java将oracle数据导出为txt文件

    可以把oracle中大量数据导出为txt格式,便于在线下载、存储等后续处理。已经测试过,可以执行。

    将sqlplus查询结果导出到文件

    - **数据量大**:如果查询结果数据量巨大,可能会导致文件过大,这时可以考虑分批导出,或者使用其他数据库工具进行导出。 通过学习这个主题,你可以更高效地管理和处理SQL查询结果,尤其是在没有图形化界面的环境...

    利用itext操作pdf从数据库导出大量数据--汇总(一)

    为了从数据库获取数据,我们需要使用JDBC连接,执行SQL查询并获取结果集。遍历结果集,将每行数据转换为表格的行,然后添加到表格中。 考虑到大量数据的处理,性能优化是必要的。可以批量插入数据到表格,而不是...

    hbase导出csv,文本,html文件

    2. **数据导入Hive**:创建一个Hive外部表,该表与HBase表结构对应,然后使用`LOAD DATA`命令将HBase查询结果导入Hive。这一步需要配置HBase与Hive之间的连接,例如通过设置`hbase-site.xml`和`core-site.xml`的属性...

    CSV大数据分批并压缩导出

    这是因为这些库在内存中构建整个工作簿模型,当数据量过大时,所需内存会迅速增加,可能导致Java虚拟机(JVM)崩溃。为了解决这个问题,可以采取分批导出策略。 分批导出是指将大数据集分割成若干小块,逐批处理和...

    Freemarker实现excel导出功能

    在Java世界里,它也被广泛用于生成静态文档或处理数据导出任务,比如Excel文件的生成。本篇文章将详细探讨如何使用Freemarker来实现Excel导出功能,并通过实际例子加深理解。 一、Freemarker基础 1. 模板语言:...

    java解决大批量数据导出Excel产生内存溢出的方案

    - 使用如JExcelApi、OpenCSV等其他第三方库,它们可能提供了更优化的数据导出方案,尤其是针对大数据量。 7. **优化Excel文件格式**: - 如果可能,可以考虑使用CSV格式代替Excel,因为CSV文件对内存的需求较低,...

    oracle导出数据的几种方法

    2. **控制最大导出量**:如果数据量过大,可以设置每次导出的最大数量,超过则分批导出,避免一次性加载过多数据。 3. **直接 IO 写入**:从数据库获取数据后,直接使用 IO 操作写入文件,避免中间集合类的内存消耗...

    wincc数据导出方法

    WinCC在生产过程中能够收集大量数据,当这些数据需要存档或分析时,通常需要将数据导出到文件中,以便于进一步处理或记录。本文将详细介绍如何将WinCC中的历史数据导出到Excel CSV文件中。 首先,要理解的是,从...

    ssh 导入导出excel+百度富文本编辑器+highcharts

    综合以上,这个案例涵盖了SSH框架的综合应用,包括数据交换与报表(Excel导入导出)、用户界面增强(ueditor)、数据可视化(highcharts)以及大数据量文本处理(CLOB)。这样的案例对于提升开发者在企业级Java Web...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

Global site tag (gtag.js) - Google Analytics