java:结果集迭代与列表迭代:是否存在性能差异

标签 java hibernate list jdbc

我必须制作一个报告实用程序,它从一个非常旧的大表中获取数据。我的搜索条件将一次取出一百万条记录,稍后将其用于一些垃圾 IO 操作。我可以选择使用 JDBC,它会给我一个结果集,或者使用 Hibernate,它会给我一个列表。我想知道两者在迭代时是否会有性能差异。

最佳答案

这取决于:

  • hibernate 版本
  • DBMS 和版本
  • JDBC 驱动程序和版本

通常的工作原理是:如果您使用以下内容创建语句:

PreparedStatement stmt = con.prepareStatement(sql,
                                              ResultSet.TYPE_FORWARD_ONLY,
                                              ResultSet.CONCUR_READ_ONLY);

然后体面 DBMS/驱动程序将大型查询,并且内存影响会很小,但代价是保持连接更长。如果你使用 Hibernate 获取大型查询的 List ,它会尝试立即将整个结果集加载到内存中,如果 GC 启动,整个事情最多只能爬行,并会崩溃最糟糕的。因此,对于大型结果集,JDBC 将是更好的选择。

现在,如果您实际上不介意在 Hibernate 中使用 List,则可以使用 ScrollableResults 。请参阅this question :即使该方法不适用于该特定情况,该技术也可以在 JDBC 方法可以正常工作的每个 DBMS/驱动程序组合上正常工作(毕竟它只是一个薄薄的 Hibernate 层)上面解释了纯 JDBC 方法)。您还可以获得 Hibernate 的 ORM 部分。

关于java:结果集迭代与列表迭代:是否存在性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778648/

相关文章:

java - 如何从子对象引用带有@MappedSuperclass注释的父对象?

c# - .Contains() 在自定义类对象列表上

python - 将数据帧列表附加到python中的数据帧列表

java - 使用 Microsoft Authenticode 证书对 jar 文件进行签名

java - 尝试将 RecyclerView 与 Parse.com 的 ParseQuery 结合使用以从数据库中提取数据时出现两个编译错误

java - 为什么这些c3p0查询经常在mysql中运行

java - 独立的 Spring Hibernate 中的空 Autowiring 字段

List [index +1] 有效 [index - 1] 无效(Flutter)

Java : Convert string to use in url as part of a get

java - Kafka 最佳实践 + 如何为 JVM 设置推荐设置