我必须创建一个报告实用程序,它从一个非常大的表中获取数据。我的搜索条件将一次取出一百万条记录,后来用于某些废话IO操作。我可以选择使用JDBC,它会给我一个ResultSet或Hibernate,它会给我List。我想知道迭代时两者之间是否存在性能差异。
答案 0 :(得分:2)
这取决于:
常常的工作原理是:如果您使用以下内容创建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部分。