代码如下:
rs = 传入的参数。数据库结果集(ResultSet)
List records = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
Map row = new HashMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.put(rsmd.getColumnName(i), rs.getObject(i));
}
records.add(row);
} return records;
当结果集rs中的纪录达到9万条时,就会出现内存溢出的现象。
原因是while中每一次都实例化一个Map对象。记录数一多就会出现内存溢出。
我尝试着把程序改成如下:
rs = 传入的参数。数据库结果集(ResultSet)
List records = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map row = new HashMap(columnCount);
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
row.put(rsmd.getColumnName(i), rs.getObject(i));
}
records.add(row);
row.Clear();
} return records;
但是结果是返回结果records中所有的值都为空。
请问怎样才能在程序中避免发生内存溢出。难道要使用克隆(clone)?在这里能用吗?
如果能用的话应该怎样使用。最好有例子。:)
rs = 传入的参数。数据库结果集(ResultSet)
List records = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
Map row = new HashMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.put(rsmd.getColumnName(i), rs.getObject(i));
}
records.add(row);
} return records;
当结果集rs中的纪录达到9万条时,就会出现内存溢出的现象。
原因是while中每一次都实例化一个Map对象。记录数一多就会出现内存溢出。
我尝试着把程序改成如下:
rs = 传入的参数。数据库结果集(ResultSet)
List records = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map row = new HashMap(columnCount);
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
row.put(rsmd.getColumnName(i), rs.getObject(i));
}
records.add(row);
row.Clear();
} return records;
但是结果是返回结果records中所有的值都为空。
请问怎样才能在程序中避免发生内存溢出。难道要使用克隆(clone)?在这里能用吗?
如果能用的话应该怎样使用。最好有例子。:)
把new放在while里面,当map用完后就清除掉
一定要把new放在里面,不然就是空的了
要考虑数据库分页
还不能分页最后发现,影响速度的 不是java程序的运行,反而是 页面显示的时候花了好多时间
数据库中的数据量很大,查询一次要很长时间。我就是想减少查询数据库的次数。一次取出来10万条记录。
有没有什么方法把这个程序改一改,避免内存泄漏?
-------------------------------我相信,你减少数据库查询带来的性能提高远远小于你浪费的性能。在java中处理或查询的性能和数据库是没法比的。
2.找开源的内存数据库来维护数据,而不是自己编码维护
3.使用数据库视图/储存过程功能来实现楼主的要求
4.如 qiubinc() 所言要加大jvm内存