2

这就是我的代码的样子。查询在不到一分钟内执行,但 while 循环需要 2 个多小时才能完成!我有大约 800,000 条记录。你能告诉我保存在reportModelList中的最佳方法吗?如果需要,我什至可以切换到 Hibernate。

PreparedStatement ps =connection.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
try{
while (rs.next()) {
ReportModel t = new ReportModel();
t.set1(rs.getDate(1));
t.set2(rs.getDouble(2));
...
...
t.set60(rs.getString(60));
reportModelList.add(t)

}}finally {
DbUtils.closeQuietly(rs);
}
4

2 回答 2

3

三个建议。

  1. 正如@Luiggi Mendoza 作为评论所写,用一个大的初始缓冲区初始化您的列表,因此它不会整天重新分配和复制。
  2. 根据您的 DB 和 JDBC 驱动程序,您可能会获得加速ps.setFetchSize(50000);(玩转常数。)如果您的 fetch 大小很小,那么您正在对您的服务器进行很多我想要更多的往返。
  3. 不要猜测哪一步是瓶颈;使用探查器。
于 2013-10-11T23:17:30.873 回答
2

除了@Andrew Lazarus 建议的措施外,还可以使用内存分析器查看此问题是否是由过多的垃圾收集开销引起的。


但是,我怀疑为列表提供良好的大小提示是否会产生重大影响。如果您使用的是ArrayList,则自动调整大小的策略是每次将分配加倍。如果你分析它,这意味着在构建列表的过程中,一个列表元素(引用)被复制少于 2 次(平均)。与报告的 2 小时运行时间相比,进行额外复制的时间很短。

于 2013-10-11T23:20:59.880 回答