Performance 为什么最后一句话;ResultSet.next()-迭代比以前的迭代花费更多的时间?

Performance 为什么最后一句话;ResultSet.next()-迭代比以前的迭代花费更多的时间?,performance,sqlite,jdbc,resultset,next,Performance,Sqlite,Jdbc,Resultset,Next,我的“while(res.next())”循环的最后一次迭代需要1.5秒,而之前的迭代只需要大约0003毫秒。我很困惑 我从我的SQLite数据库中获得一个带有常见JDBC查询的结果集。结果集不是很大,它总是4列宽,0到100行长。然后我想将结果集数据保存在POJO中,并将这些POJO存储在ArrayList中。我使用的是通常的迭代方法,您只需执行一个“while(res.next())”循环,然后迭代整个结果集。我发现代码中存在瓶颈,可以将其缩小到while(res.next())-循环。我开

我的“while(res.next())”循环的最后一次迭代需要1.5秒,而之前的迭代只需要大约0003毫秒。我很困惑

我从我的SQLite数据库中获得一个带有常见JDBC查询的结果集。结果集不是很大,它总是4列宽,0到100行长。然后我想将结果集数据保存在POJO中,并将这些POJO存储在ArrayList中。我使用的是通常的迭代方法,您只需执行一个“while(res.next())”循环,然后迭代整个结果集。我发现代码中存在瓶颈,可以将其缩小到while(res.next())-循环。我开始调试并测量代码中的执行时间,结果发现最后一个.next()-调用需要很长时间,该调用应返回false,以便循环停止

ArrayList trades=new ArrayList();
尝试
{
语句Statement=connector.getConnection().createStatement();
setFetchSize(1337);
ResultSet res=statement.executeQuery(“从时间戳>=0且时间戳<1337;”的交易中选择*”;
res.setFetchSize(1337);
int numberOfTrades=0;
long startTime=System.nanoTime();
while(res.next())
{
long addObjectTime=System.nanoTime();
添加(新交易(res.getLong(“id”)、res.getLong(“时间戳”)、res.getDouble(“价格”)、res.getDouble(“金额”));
numberOfTrades++;
System.out.println(“将交易添加到“+(System.nanoTime()-addObjectTime)+“ns.”中的列表中);
}
System.out.println(“列表创建在”+(System.nanoTime()-startTime)+“ns.”内完成);
System.out.println(“交易数量:+numberOfTrades”);
}捕获(SQLE异常)
{
e、 printStackTrace();
}
这是我的密码。如您所见,我已经尝试过使用不同的fetchSize,正如其他人在performance threads中提到的.next()方法一样。我尽了我所能,但结果仍然是这样:

Added trade to list within 46000ns.
Added trade to list within 3200ns.
Added trade to list within 2400ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 4500ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 3100ns.
Added trade to list within 2400ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 2400ns.
Added trade to list within 2400ns.
Added trade to list within 2300ns.
Added trade to list within 2200ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 2300ns.
Added trade to list within 11100ns.
List-creation completed within 1548543200ns.
Number of trades: 22

使用ResultSet中的数据将POJO添加到我的ArrayList通常需要2-5微秒。总而言之,循环不应该比添加交易的所有执行时间加起来要长很多,对吗?在我的例子中是01073毫秒。相反,循环总共需要超过1.5秒,这将是我预期的10000倍。我根本不知道这里发生了什么。这对我的程序来说是一个严重的问题,因为代码片段执行了大约100000次,因此150000秒将是40个小时的性能损失:(

我实际上解决了这个问题,但我不能100%确定为什么现在解决了。我查询的数据库有数百万个条目,并且总是由一列访问(timestamp)。我索引了timestamp,性能问题完全消失了。我仍然不知道.next()的原因-方法的行为方式是这样的。

您没有提到任何有关您的环境的内容。这是一个使用探查器来确定时间精确走向的完美地方。可能是因为第一个N-1结果已经发送,而最后一个结果需要额外的请求和发送。请调查您的提取大小。@Gene我给自己准备了一个探查器和评测的结果是JDBC3ResultSet.java:74 org.sqlite.core.NativeDB.step(long)占用所有的时间。我无法深入了解该方法。我将尝试并研究这一切。感谢您的输入。@user207421我也考虑过这一点。但是考虑到OP正在做的事情,1.5秒远不是正常的。哈哈。表的自然扫描顺序会在早期和后期命中所有满足WHERE子句的条目y很快。但所有的行都必须扫描到底,以验证没有更多的行。索引将字段按排序顺序排列,因此只需扫描感兴趣的时间戳范围。然后扫描停止。这基本上只是提醒“保持索引中的f***笔直”1.有很多东西都是索引的问题……我想你知道我的意思;)谢谢你的帮助,我的朋友。