没有合适的资源?快使用搜索试试~ 我知道了~
Java ResultSet导出大数据.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 48 浏览量
2022-11-07
14:51:39
上传
评论
收藏 123KB DOCX 举报
温馨提示
试读
4页
。。。
资源推荐
资源详情
资源评论
众所周知,java 在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而
在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手
段是分解,压缩,并行,临时文件等方法;
例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是
Excel 或文本格式的 CSV;对于 Excel 来讲,对于 POI 和 JXL 的接口,你很多时候没
有办法去控制内存什么时候向磁盘写 入,很恶心,而且这些 API 在内存构造的对
象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分 Excel,还好,POI
开始意识到这个问题,在 3.8.4 的版本后,开始提供 cache 的行数,提供了
SXSSFWorkbook 的接口,可以设置在内存中的行数,不过可惜的是,他当你超过这
个行数, 每添加一行,它就将相对行数前面的一行写入磁盘(如你设置 2000行的话,
当你写第 20001 行的时候,他会将第一行写入磁盘),其实这个时候他些的临时 文
件,以至于不消耗内存,不过这样你会发现,刷磁盘的频率会非常高,我们的确不
想这样,因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷 1M 之
类的做法,可惜现在还没有这种 API,很痛苦,我自己做过测试,通过写小的 Excel
比使用目前提供刷磁盘的 API 来写大文件,效率要高一些,而且这样 如果访问的
人稍微多一些磁盘 IO 可能会扛不住,因为 IO 资源是非常有限的,所以还是拆文件
才是上策;而当我们写 CSV,也就是文本类型的文件,我们很多时 候是可以自己控
制的,不过你不要用 CSV 自己提供的 API,也是不太可控的,CSV 本身就是文本文
件,你按照文本格式写入即可被 CSV 识别出来;如何写入 呢?下面来说说。。。
在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了方便,我
们未必要 1M 怎么来处理,这个交给底层的驱动程序去拆分,对于我们的程序来讲
我们认为它是连续写即可;我们比如想将一个 1000W 数据的数据库表,导出到文件;
此时,你要么进行分页,oracle 当然用三层包装即可,mysql 用 limit,不过分页每次
都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下
游动,编译一部分数据(如 10000 行)将写文件一 次(写文件细节不多说了,这个是
最基本的),需要注意的时候每次 buffer 的数据,在用 outputstream 写入的时候,最
好 flush 一下,将缓 冲区清空下;接下来,执行一个没有 where 条件的 SQL,会不会
将内存撑爆?是的,这个问题我们值得去思考下,通过 API 发现可以对 SQL 进行一
些操 作,例如,通过:PreparedStatement statement =
connection.prepareStatement(sql),这是默认得到的预编译,还可以通过设置:
PreparedStatement statement = connection.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
资源评论
春哥111
- 粉丝: 1w+
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功