`

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

    博客分类:
  • 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
分享到:
评论

相关推荐

    Java 导出大批量数据excel(百万级).pdf

    目前java框架中能够生成excel文件的的确不少,但是,能够生成大数据量的excel框架,我倒是没发现,一般数据量大了都会出现内存溢出,所以,生成大数据量的excel文件要返璞归真,用java的基础技术,IO流来实现。...

    Java将oracle数据导出为txt文件

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

    使用python将大量数据导出到Excel中的小技巧分享

    (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以上两个问题。 (2)...

    MySQL 文本文件的导入导出数据的方法

    但有时为了更快速地插入大批量数据或交换数据,需要从文本中导入数据或导出数据到文本。 一、 建立测试表,准备数据 首先建立一个用于测试的表示学生信息的表,字段有id、姓名、年龄、城市、薪水。Id和姓名不 能为...

    Java实现从数据库导出大量数据记录并保存到文件的方法

    主要介绍了Java实现从数据库导出大量数据记录并保存到文件的方法,涉及Java针对数据库的读取及文件写入等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Excel OLE 操作xls单个表格导出数据的例子

    从单个数据表根据第一列数据的不同,提取并保存成单个的txt文件。...其中涉及了OLE方式的xls文件打开,单个数据表选择,表格数据SafeArray方式读取,最后是保存成txt文本文件,数据是石油行业通用的井斜数据格式。

    微信备份导出精灵v1.123 全面支持安卓苹果手机+一键导出微信备份到电脑

    全面支持安卓、苹果手机(无需 ROOT 及越狱)一键导出微信备份到电脑,支持导出 Html、Excel、Txt 等格式(包括:文本、语音、视频、文件等),方便微信备份打印操作,查看、导出数据时还可以设置时间范围,让管理浏览...

    sqluldr2数据导出工具

    最快的数据导出为文本工具,针对导出大批量数据,效率超过,大型数据库系统好用

    MySQL数据库迁移快速导出导入大量数据(外发).txt

    使用MySQL的SELECT INTO OUTFILE 、LOAD DATA INFILE快速导出导入数据 LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。MySQL官方文档也说明了,该方法比一次性插入一条数据性能快20倍。

    导出Excel技术分享

    这将极大地简化大数据量处理的过程,提高工作效率。此外,导出Excel技术还可以帮助我们生成具有格式化样式和公式的Excel报表,使数据的展示更加直观、易读。 然后,我将深入探讨导出Excel技术的实现方法和工具。在...

    TIA博途V17中DB块如何导出成源文件或XML文件或EXCEL中?.pdf

    TIA博途V17中DB块如何导出成源文件或XML文件或EXCEL中? 博途中导出DB块的3种方法介绍。

    [rar文件] java导出100万以上excel大数据样例

    二、思路:将数据存储到一个.xls的文件内,实际写入的是可以通过excel打开的html文本文件。由于文本文件可以进行续写,可以避免内存溢出。 三、优点:结合stringtemplate模板引擎库生成速度快,可以定义excel格式。 ...

    MySQL数据库使用mysqldump导出数据详解

    在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具;它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明列出来。 语法...

    基于python实现的上市公司新闻文本分析与分类预测 完整代码+报告 计算机毕设参考

    从历史新闻数据库中抽取与某支股票相关的所有新闻文本,利用该支股票的日线数据(比如某一天发布的消息,在设定N天后如果价格上涨则认为是利好消息,反之则是利空消息)给每条新闻贴上“利好”和“利空”的标签,并...

    导出工作表并命名保存

    我们用excel做了一套完整的台帐系统,但上报报表时发现,我们用了大量的链接,如果单独复制到新工作表,链接中断数据会出错,这个宏提出了解决方案

    php版mysql大数据库备份和恢复工具

    基本上,一般的博客/论坛数据都不能保证这种纯净性,谁也不能保证你的文章中不会混合使用简体和繁体文字,所以这种跨字符集的导入导出数据难度很大.绝对不要轻易尝试这种游戏.目前的主流论坛如Discuz、PHPWind等都提供...

    NER命名体识别:文本标注工具Doccano配置方法/命名实体识别任务标注方法实例/标注导出与BIO处理/标签处理并完成对齐操作

    数据收集和标注:收集包含命名实体的文本数据,并为每个实体标注相应的标签(实体类型)。 特征提取:从文本数据中提取有用的特征,如词性、词形、上下文等。这些特征将作为输入提供给模型。 模型训练:使用标注好的...

    数据分析系统.docx

    4.2.3、按用户自定义条件进行报表查询、归类查询及数据导出 4.3、按报表条件生成统计数据 4.3.1 自定义报表统计项 4.3.2 自定义报表统计界面 4.3.3生成报表统计界面 4.4、实现报表数据的定时推送功能 4.4.1 定义邮件...

    Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法

    本文实例讲述了Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法。分享给大家供大家参考。具体实现方法如下: # Export Oracle database tables to CSV files # FB36 - 201007117 import sys import csv ...

Global site tag (gtag.js) - Google Analytics