【问题标题】:To use an ArrayList or a LinkedList while looping through a JDBC ResultSet在循环 JDBC ResultSet 时使用 ArrayList 或 LinkedList
【发布时间】: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


【解决方案1】:

ArrayList 可能是此用例的最佳选择。

如果您需要提高性能,您应该使用分析器来确定瓶颈。我敢打赌,增加获取大小将对提高性能产生最大的影响。见https://docs.oracle.com/cd/A87860_01/doc/java.817/a83724/resltse5.htm

@tgdavies 关于直接流式传输到 JSON 的评论非常好。避免创建中间数据结构将显着提高性能。不利的一面是,这将是您的应用程序的 API 更改,这可能是一个需要很长时间来协调的官僚程序。

另一种选择是根据返回的平均记录数预先分配 ArrayList,但您绝对应该只在分析器将其识别为问题时才这样做。

【讨论】:

  • 直接流式传输到 JSON 是否意味着使用 Web 套接字?
  • 我更多地考虑实现 Stream 接口。或者,您可以拥有某种功能接口(可能是来自 java.util.function 的消费者),其中消费者被提供给数据库 fetch 方法。实际上,您当前的实现几乎就在那里。如果你定义一个带有消费者接口的方法,你甚至可以传递一个 List 对象的 add 方法给它。您当前的方法将创建一个列表,将添加对象的 add 方法传递给您的新方法。见docs.oracle.com/javase/tutorial/java/javaOO/…
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2010-10-13
  • 2012-01-16
  • 2012-03-24
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多