【发布时间】:2018-01-10 13:52:07
【问题描述】:
我有一个包含 50 万条记录的结果集的查询,每条记录我都在创建一个对象并尝试将其添加到 ArrayList 中。
如何优化此操作以避免出现堆空间不足错误时的内存问题。
这是一段代码:
while (rs.next()) {
lista.add(sd.loadSabanaDatos_ResumenLlamadaIntervalo(rs));
}
public SabanaDatos loadSabanaDatos_ResumenLlamadaIntervalo(ResultSet rs)
{
SabanaDatos sabanaDatos = new SabanaDatos();
try {
sabanaDatos.setId(rs.getInt("id"));
sabanaDatos.setHora(rs.getString("hora"));
sabanaDatos.setDuracion(rs.getInt("duracion"));
sabanaDatos.setNavegautenticado(rs.getInt("navegautenticado"));
sabanaDatos.setIndicadorasesor(rs.getInt("indicadorasesor"));
sabanaDatos.setLlamadaexitosa(rs.getInt("llamadaexitosa"));
sabanaDatos.setLlamadanoexitosa(rs.getInt("llamadanoexitosa"));
sabanaDatos.setTipocliente(rs.getString("tipocliente"));
} catch (SQLException e) {
logger.info("dip.sabana.SabanaDatos SQLException : "+ e);
e.printStackTrace();
}
return sabanaDatos;
}
注意:使用list的原因是这是一个critic系统,我只能每2小时打一个电话给bd。我无权在短时间内对 bd 进行更多调用,但我需要每 10 分钟显示一次数据。示例:第一次查询10行,我在sql查询后每分钟显示1行。
我无权创建本地数据库、写入文件或其他...只是访问内存。
【问题讨论】:
-
为了更好的内存管理使用 LinkedList
-
为什么需要列表?之后你用它做什么?尝试直接在结果集迭代中做进一步处理。
-
您没有向我们展示足够多的代码,我们无法优化任何东西。为什么你需要(或认为你需要)ArrayList 中的所有这些对象,同时?将这么多对象添加到 ArrayList 几乎肯定会破坏使用数据库的目的。
-
如果问题是你只能每两个小时查询一次数据库,但想随时查询,解决方案可能是在本地制作自己的数据库并镜像真实的数据库
-
@Adelin 是的,这更有意义......如果大小是可预测的,可以预先指定容量......
标签: java performance arraylist