ResultSet大数据量遍历

最近在做一个导出的程序,使用Java调用oracle存储过程,返回ResultSet,然后遍历ResultSet,将数据添加到List中。以下是遍历代码。Listresu... 最近在做一个导出的程序,使用Java调用oracle存储过程,返回ResultSet,然后遍历ResultSet, 将数据添加到List中。 以下是遍历代码。
List resultsMap = new ArrayList();
while (rs.next()) {
ListOrderedMap listOrderedMap = new ListOrderedMap();
for (int j = 0; j < outParameter.getColumns().size(); j++) {
Object value = "NULL";
try {
value = rs.getObject(outParameter.getColumns().get(j).toString());
} catch (Exception e) {
// TODO: handle exception
logger.warn("列[" + outParameter.getColumns().get(j) + "]不存在,请检查物理表字段是否创建正确.");
}
listOrderedMap.put(outParameter.getColumns().get(j), value);
}
resultsMap.add(listOrderedMap);
}
我的数据量比较大,大概有一百万条数据左右,遍历的时候一直内存溢出。 请教各位高手,可不可以将ResultSet分成多个队列遍历、或者使用多线程遍历,对这些东东我不是很懂, 大家有这方面的建议或者思路吗? 求教。
展开
 我来答
harrywu8a
2012-04-17
知道答主
回答量:1
采纳率:0%
帮助的人:1636
展开全部
你这种情况的话,除了那位老兄的说法,只能用游标分页了,每次从游标中取出10000条缓存为List来处理数据,当然这种办法速度上可能不是很理想
不一定是飞机
推荐于2018-05-15 · TA获得超过827个赞
知道小有建树答主
回答量:270
采纳率:100%
帮助的人:325万
展开全部
这个不用说,必然内存溢出
List resultsMap = new ArrayList();
这个是加载在内存中的,不GC就一致占用内存
确切的说,是你的存储方式有问题,没有谁一下把100W条数据直接读入内存的
简单的方法就是分页读取,每次读指定条数,根据页数选择读取
追问
你还, 谢谢你呀, 可不可以做一个队列分多次加载呢, 因为如果想你说的分页的话,可以实现,但是我的程序改动太大了呀。 我现在就想在尽量少改动原程序的基础上实现功能。
追答
这个需要你自己把握,总之不管怎么读取,在内存中的一定不能多!

如果这个项目只是练习的话,最好改正过来。有了第一次,以后工作中才能做好。
如果这个是要上线的..那么好吧,很严肃的告诉你,你这么写一定会被骂惨的
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不离不弃wjj
2011-07-27 · 超过16用户采纳过TA的回答
知道答主
回答量:118
采纳率:0%
帮助的人:53.1万
展开全部
你可以把存储过程写活啊,写带参数的存储过程,如每次取10000条,通过循环来控制控制调用存储过程的参数。应该能防止内存溢出!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式