Java 分页查询、流式查询、Excel POI导出

1,523 阅读2分钟

分页查询

  1. sql语句,简单直接高效,pageIndex(页码),pageSize(每页Size)

    SELECT * FROM test LIMIT (pageIndex - 1) * pageSize , pageSize;

  2. 数据库兼容性差,数据量大时,越往后,查询数据越慢,百万表,两个字段,文件大小16MB,一页10000条数据,查询第一页时需要155ms,查询最后一页时2770ms。

流式查询

  1. 大数据量不会有OOM问题;
  2. 占用数据库时间长,导致网络拥塞的可能性大。
  3. 百万表,两个字段,文件大小16MB,一页10000条数据,流式查询需要6797ms,分页查询需要147921ms。

  • setFetchSize是为了减少网络交互次数设计的,ResultSet会一次性从服务器上取得多少行数据回来,下次rs.next时,可以直接从内存中获取数据而不需要网络交互,提高了效率。如果设置过大也会造成内存的上升。
  • postgres
    • connection的autoCommit必须为false,因为开启autoCommit的话,查询完成cursor会被关闭,那么下次就不能再fetch了;
    • ResultSet必须是ResultSet.TYPE_FORWARD_ONLY类型,这个是默认的,无法向后滚动;
    • 查询语句必须是单条,不能是用分号组成的多条查询。

Excel(POI)

HSSFWorkbook

  1. 操作Excel2003以前的版本,扩展名.xls(特有的二进制格式,复合文档类型结构);
  2. 256个Sheet,每个Sheet(65535行,256列),一般不会发生OOM。

XSSFWorkbook

  1. 操作Excel2007以后的版本,扩展名.xlsx(XML类型的结构);
  2. 256个Sheet,每个Sheet(1048576行,16384列),随着数据量增大,很有可能发生OOM。

SXSSFWorkbook

  1. POI3.8 beta3开始支持,基于XSSFWorkbook的流式扩展,低内存占用的工作簿;
  2. 滑动窗口机制,主要用于数据量大的电子表格和虚拟机堆有限的情况;
  3. 导出Excel后应该调用workbook.dispose()删除之前保存的临时文件;
  4. 没有提供读取文件流的方法。

设置rowAccessWindowSize的值,导出百万表(两个字段,文件大小16MB)为Excel的速度。