我必须制作一个报告实用程序,它从一个非常旧的大表中获取数据。我的搜索条件将一次取出一百万条记录,稍后将其用于一些垃圾 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/