[英]Java MySQL jdbc vs Hibernate on implementation of Select queries
对于这个模糊的问题,我们深表歉意,因为我不知道如何用恰当的句子来写它,如果您想对它进行更有意义的编辑,请继续。
我实际上想问,什么时候我们做这样的事情:
Select * from TableWithBillionRecords Limit 1000000
使用任一结果集:
PreparedStatement.executeQuery()
或休眠:
getCurrentSession().createQuery(query).list()
一旦执行了该行,这是否意味着Web服务器实际上从我的数据库服务器中提取了整整100万行? 还是接口背后隐藏着一些流逻辑?
感谢您提供的信息,因为它可以帮助我确定是否应该将其拆分为多个查询,逐个选择一个块,或者实际上只选择一整堆都可以。
再次感谢你们。
大多数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/
默认情况下, Hibernate会急切地获取结果,因为与数据库的大多数交互操作通常都是这样:提取几条记录,显示它们,可能修改它们,然后再次存储。
提取数百万行是一个完全不同的用例,主要用于以下情况:
具体来说, Hibernate没有提供任何方法来像在JDBC或某些其他ORM中那样在数据库中保留惰性游标并进行惰性滚动。 但这不是必须的。 您始终可以在Hibernate项目中求助于纯JDBC。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.