【发布时间】:2021-11-12 22:20:51
【问题描述】:
这是一个关于在循环通过 JDBC ResultSet 对象时需要使用哪种列表来累积数据的一般问题。
我在一个项目中工作,其中某些查询会返回数千条记录。 SQL 查询使用 JDBC 方法执行,结果值通过 ResultSet 循环。 SQL 查询产生一个排序顺序。
List<Company> list = new ArrayList<>();
ResultSet rs = statement.execute();
while (rs.next()){
Company company = new Company();
rs.getString("company_name");
rs.getInteger("company_id");
list.add(company);
}
这个列表返回到服务层,数据绑定是通过 JAXB 或 Jackson ObjectMapper 将其转换为 XML 格式或 JSON 对象并作为 REST 调用的一部分返回。
大约有 200 个这样的代码 sn-ps,其中使用 ArrayList 来累积结果数据。
查询: 由于每次添加新数据项都会对列表进行结构修改,因此使用 LinkedList 而不是 ArrayList 会有什么不同吗?哪一种可以用来提升性能?
请注意,列表不会在应用程序的其他位置进行操作。数据在数据层插入,在服务层进行转换。
【问题讨论】:
-
请参考这个问题。 stackoverflow.com/questions/322715/…
-
LinkedList 在几乎每个用例中通常速度较慢且内存较多。 ArrayList 不会在每次迭代中进行结构修改 - 否则
add将是O(n)不摊销O(1)。 LinkedList 很可能会更慢 - 但唯一知道的方法是基准测试。 -
@KaramveerGalot 您的陈述显然是不真实的。当然你可以在两个方向上迭代一个数组!!
-
如果您对性能感兴趣,您应该考虑使用 JDBC 而不是列表类型。 Improve JDBC Performance
-
鉴于数据是从数据库中读取的(使用 IO),然后作为 HTTP 结果返回(使用 IO),所选择的中间内存结构可能对性能影响不大。如果您要返回数以千计的记录,请考虑使用分页,或者客户端可以进行更窄的搜索。也许您可以直接从 ResultSet 流式传输到 JSON。
标签: java arraylist collections linked-list