java:ResultSet迭代与列表迭代:是否存在性能差异

时间:2014-07-16 10:36:31

标签: java hibernate list jdbc

我必须创建一个报告实用程序,它从一个非常大的表中获取数据。我的搜索条件将一次取出一百万条记录,后来用于某些废话IO操作。我可以选择使用JDBC,它会给我一个ResultSet或Hibernate,它会给我List。我想知道迭代时两者之间是否存在性能差异。

1 个答案:

答案 0 :(得分:2)

这取决于:

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

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

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

然后体面的 DBMS /驱动程序将流式大型查询,并且内存影响将很小,代价是持有Connection更长时间。如果你得到List用于Hibernate的大查询,它会尝试立即将整个结果集加载到内存中,如果GC启动,整个事情将充其量爬行并且最坏的情况下会崩溃。因此,对于大结果集,JDBC将是更好的选择。

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