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分成多个队列遍历、或者使用多线程遍历,对这些东东我不是很懂, 大家有这方面的建议或者思路吗? 求教。 展开
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分成多个队列遍历、或者使用多线程遍历,对这些东东我不是很懂, 大家有这方面的建议或者思路吗? 求教。 展开
3个回答
展开全部
这个不用说,必然内存溢出
List resultsMap = new ArrayList();
这个是加载在内存中的,不GC就一致占用内存
确切的说,是你的存储方式有问题,没有谁一下把100W条数据直接读入内存的
简单的方法就是分页读取,每次读指定条数,根据页数选择读取
List resultsMap = new ArrayList();
这个是加载在内存中的,不GC就一致占用内存
确切的说,是你的存储方式有问题,没有谁一下把100W条数据直接读入内存的
简单的方法就是分页读取,每次读指定条数,根据页数选择读取
追问
你还, 谢谢你呀, 可不可以做一个队列分多次加载呢, 因为如果想你说的分页的话,可以实现,但是我的程序改动太大了呀。 我现在就想在尽量少改动原程序的基础上实现功能。
追答
这个需要你自己把握,总之不管怎么读取,在内存中的一定不能多!
如果这个项目只是练习的话,最好改正过来。有了第一次,以后工作中才能做好。
如果这个是要上线的..那么好吧,很严肃的告诉你,你这么写一定会被骂惨的
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以把存储过程写活啊,写带参数的存储过程,如每次取10000条,通过循环来控制控制调用存储过程的参数。应该能防止内存溢出!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询