对于这个模糊的问题感到抱歉,因为我不知道如何用正确的句子写出来,如果你们中的任何一个想要将它编辑成更有意义的东西,请继续。
我真的想问,当我们做这样的事情时:
Select * from TableWithBillionRecords Limit 1000000
使用结果集:
PreparedStatement.executeQuery()
或Hibernate:
getCurrentSession().createQuery(query).list()
一旦执行该行,是否意味着Web服务器实际上从我的数据库服务器中抽出了100万行?或者接口后面是否有一些流逻辑?
感谢您提供的信息,因为它可以帮助我决定是否应该将其分解为多个查询按块选择块,或者实际上是否可以选择一堆。
再次感谢你们。
答案 0 :(得分:1)
大多数JDBC驱动程序的默认提取大小为10。
在正常的JDBC编程中,如果要检索1000行,则需要在应用程序和数据库服务器之间进行100次网络往返以传输所有数据。这肯定会影响您的应用程序响应时间。
原因是JDBC驱动程序旨在从数据库中获取少量行,以避免任何内存不足问题。
例如如果您的查询检索到100万行,则JVM堆内存可能不足以容纳大量数据,因此JDBC驱动程序旨在检索少量(10行)一次只要你有更好的设计来处理应用程序编码中的大行集,它就可以支持任意数量的行。
如果将获取大小配置为100,则到数据库的网络访问次数将变为10.这将显着提高应用程序的性能。
调整抓取大小时需要考虑的重要注意事项:
参考:http://webmoli.com/2009/02/01/jdbc-performance-tuning-with-optimal-fetch-size/
答案 1 :(得分:0)
Hibernate会急切地获取结果,因为这与大多数与数据库的交互往往是这样的:获取几条记录,显示它们,可能修改它们,再次存储它们。
获取数百万行是一个完全不同的用例,主要应用于:
具体而言,数据库中的Hibernate doesn't offer any way to keep a lazy cursor并像JDBC或其他一些ORM一样懒惰地滚动它。但它并不需要。你总是可以在Hibernate项目中使用普通的JDBC。