poi-java 使用POI导出大数据,服务器内存不释放

问题描述

java 使用POI导出大数据,服务器内存不释放

RT,我用java 使用POI导出大数据,
数据是可以导出来。但是服务器的内存一直不释放。导一次 内存就会增加100M-2G 视数据量大小。当超过JVM设置的15G时,服务就会瘫痪掉,无法访问、
主要代码如下,

 MapList list  = db.query(SQL);
        String EXCELNAME = (new StringBuilder(String.valueOf(unitId))).toString();
         HSSFWorkbook workbook = new HSSFWorkbook();
            //createSheet(excel工作表名)
            HSSFSheet sheet = workbook.createSheet(EXCELNAME);
            //下面是设置excel表中标题的样式
            HSSFCellStyle title_style = workbook.createCellStyle();
            title_style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            title_style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            title_style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            title_style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            title_style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            title_style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            title_style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            HSSFFont title_font = workbook.createFont();
            title_font.setColor(HSSFColor.VIOLET.index);
            title_font.setFontHeightInPoints((short) 12);
            title_font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            title_style.setFont(title_font);
            //内容的样式
            HSSFCellStyle content_style = workbook.createCellStyle();
            content_style.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
            content_style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            content_style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            content_style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            content_style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            content_style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            content_style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            content_style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            HSSFFont content_font = workbook.createFont();
            content_font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            content_style.setFont(content_font);
            //填充标题内容
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < TITLES.length; i++) {
                //设置标题的宽度自适应
                sheet.setColumnWidth(i, TITLES[i].getBytes().length * 2 * 256);
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(title_style);
                HSSFRichTextString text = new HSSFRichTextString(TITLES[i]);
                cell.setCellValue(text);
            }
               for (int i = 0; i < list.size(); i++) {
                   row = sheet.createRow( i + 1);
                   for( int val=0;val<TITLES.length;val++){
                       HSSFCell cell = row.createCell(val);
                        cell.setCellStyle(content_style);
                        HSSFRichTextString richString = new HSSFRichTextString(list.getRow(i).get(val));
                        cell.setCellValue(richString);
                   }
           }
            response.reset();
            response.setContentType("application/vnd.ms-excel ;charset=" +
                      LocaleConfig.getEncoding());
            response.setHeader("Content-disposition", "attachment;filename="
                  +EXCELNAME   + ".xls");
            response.addHeader("Cache-Control", "no-cache");
            response.addHeader("Cache-Control", "no-store");
            OutputStream ouputStream = response.getOutputStream();
            try {
                workbook.write(ouputStream);
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                    if(ouputStream!=null){
                         ouputStream.flush();
                         ouputStream.close();
                    }

            }
    }

解决方案

java使用POI的导入导出
java中使用poi导出Excel详解
java中使用poi导出Excel详解

时间: 2024-10-26 05:57:13

poi-java 使用POI导出大数据,服务器内存不释放的相关文章

导出大数据量excel,用POI

问题描述 导出大数据量excel,用POI 需要导出的数据量可能非常大(超过10W条),而且要照顾到没装07Excel的机器,不能用SXSSFworkbook.鉴于一个sheet页最多65000多条记录,那么大数据就需要多个sheet页.由于导出前要先查数据库,是应该一次查出所有数据然后导出还是分次查询?每次查询65000条数据? 解决方案 这么大的文件,excel 2003未必能打开.建议分页存入多个excel文件. 解决方案二: 看速度和效率了,分次是不是速度还快点

面向大容量存储 宝德大数据服务器评测

文章讲的是面向大容量存储 宝德大数据服务器评测,经过2013年一年的推广,大数据的概念已经成为当下作为火爆的IT概念.无论是消费类还是企业级产品,大数据都是炙手可热的关键词之一.从数据中心的角度来说,如何更好的利用大数据技术,势必需要硬件与软件的双重支持,而在硬件上的支持则处于基础地位.如今有许多服务器厂商推出了自己的大数据服务器,宝德作为国内知名的服务器厂商也是不甘落后.今天我们要介绍的就是来自宝德的大数据服务器,其型号为PR1912R. ▲宝德PR1912R大数据服务器 宝德PR1912R大

java 环境下操作大数据问题

问题描述 现在碰到个大数据频繁操作问题,数据量很大,但又得对这大数据量进行频繁的读和写,现在还没有好的方案,哪位大牛能给点思路啊.. 问题补充:这数据和数据库无关,主要是移动的话单,短信等交换机数据汇聚处理.相当于要将这些数据放入集合中,这操作过程中还要对此集合进行频繁的读和写操作,不知道这样描述大牛们能不能看明白我的意思? 解决方案 一般对于大数据的读写操作,都会有一个cache层作为缓冲.一般选用cache的话,会用memcached或redis(还有一个阿里的cache).然后再加上读写分

为什么导出大数据都在一行里面啊?

问题描述 哪位大大知道的?导出小数据还没有问题.但是如果导出数据量大一些,大概几十万吧.如果用excel打开,都在第一行里,没法全部打开,怎么回事?环境是XPsp3和office2007 解决方案 解决方案二:自己顶顶解决方案三:你用什么导啊?解决方案四:导出方法不对.解决方案五:你用的什么方法?解决方案六:应该是数量太大了或者说有特殊符号

Java实现Dbhelper支持大数据增删改_java

在做项目的时候,技术选型很重要,在底层的方法直接影响了我们对大数据访问以及修改的速度,在Java中有很多优秀的ORM框架,比如说:JPA,Hibernate 等等,正如我们所说的,框架有框架的好处,当然也存在一些可以改进的地方,这个时候,就需要我们针对于不同的业务不同的需求,不同的访问量,对底层的架构重新封装,来支持大数据增删改. 代码: import java.io.*; import java.sql.*; import java.util.*; import java.util.loggi

poi java excel-java poi 导出excel 把一样的数据动态合并单元格

问题描述 java poi 导出excel 把一样的数据动态合并单元格 急求,有一个list数据 导出成 这种格式 公司和年份两列是要有动态合并功能 并且年份合并的时候不能跨公司 有没有大神帮帮忙... HSSFWorkbook workbook = new HSSFWorkbook(); String[] columnNames = new String[]{"编号","公司", "年份","性质", "名称&qu

phpadmin如何导入导出大数据文件及php.ini参数修改_php技巧

最近遇到了数据库过大的时候用phpadmin导入的问题,新版本的phpadmin导入限定是8M,老版本的可能2M,我的数据库有几十兆这可怎么办呢? 首先如果你有独立服务器或vps的话可以找到 Apache 下的php.ini 这个文件来修改这个8M或2M的限制,怎么修改呢? 搜索到,修改这三个 复制代码 代码如下: upload_max_filesize = 2M post_max_size = 8M memory_limit = 128M 修改完毕 重启下服务,进phpadmin看看吧,应该可

phpExcel导出大量数据出现内存溢出错误的解决方法_php技巧

phpExcel将读取的单元格信息保存在内存中,我们可以通过 复制代码 代码如下: PHPExcel_Settings::setCacheStorageMethod() 来设置不同的缓存方式,已达到降低内存消耗的目的! 1.将单元格数据序列化后保存在内存中 复制代码 代码如下: PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized; 2.将单元格序列化后再进行Gzip压缩,然后保存在内存中 复制代码 代码如下: PHPEx

Java Mysql blob 存取大文件时内存溢出如何解决?

问题描述 今天模拟一些数据,需要将一些大文件我用的是755M(可以更大)存入到Mysql的一个longblob字段中.我使用了pstmt.setBinaryStream(2, fis, f.length());的方式,但总是抛出异常.貌似Mysql 的JDBC总是先将stream中的数据读成byte[]然后再往数据库中存,所以总是内存溢出,不知哪位高人可有解决方案?!我的代码: ApplicationContext contxt = new ClassPathXmlApplicationCont