Java MySQL jdbc vs Hibernate对Select查询的实现

时间:2016-02-29 01:44:46

标签: java mysql hibernate

对于这个模糊的问题感到抱歉,因为我不知道如何用正确的句子写出来,如果你们中的任何一个想要将它编辑成更有意义的东西,请继续。

我真的想问,当我们做这样的事情时:

Select * from TableWithBillionRecords Limit 1000000

使用结果集:

PreparedStatement.executeQuery()

或Hibernate:

getCurrentSession().createQuery(query).list()

一旦执行该行,是否意味着Web服务器实际上从我的数据库服务器中抽出了100万行?或者接口后面是否有一些流逻辑?

感谢您提供的信息,因为它可以帮助我决定是否应该将其分解为多个查询按块选择块,或者实际上是否可以选择一堆。

再次感谢你们。

2 个答案:

答案 0 :(得分:1)

大多数JDBC驱动程序的默认提取大小为10。

在正常的JDBC编程中,如果要检索1000行,则需要在应用程序和数据库服务器之间进行100次网络往返以传输所有数据。这肯定会影响您的应用程序响应时间。

原因是JDBC驱动程序旨在从数据库中获取少量行,以避免任何内存不足问题。

例如如果您的查询检索到100万行,则JVM堆内存可能不足以容纳大量数据,因此JDBC驱动程序旨在检索少量(10行)一次只要你有更好的设计来处理应用程序编码中的大行集,它就可以支持任意数量的行。

如果将获取大小配置为100,则到数据库的网络访问次数将变为10.这将显着提高应用程序的性能。

调整抓取大小时需要考虑的重要注意事项:

  1. 确保您的JDBC驱动程序支持配置提取大小。
  2. 获取大小应基于您的JVM堆内存设置。由于JVM堆大小因不同环境而异,因此请不要使用硬编码获取大小将其保留为可配置参数。
  3. 如果您的提取大小很大,您可能会遇到内存不足问题。例如,较少数量的列表可能支持较大的行提取大小而不是更多的列数。
  4. 您可以根据blob,image等特定数据类型设置提取大小。我们遵循列的某些命名约定,例如所有image和blob列都将具有后缀“Blob”。如果查询不包含“Blob”字,则设置高提取大小,否则设置低提取大小。
  5. 参考:http://webmoli.com/2009/02/01/jdbc-performance-tuning-with-optimal-fetch-size/

答案 1 :(得分:0)

默认情况下,

Hibernate会急切地获取结果,因为这与大多数与数据库的交互往往是这样的:获取几条记录,显示它们,可能修改它们,再次存储它们。

获取数百万行是一个完全不同的用例,主要应用于:

  • 执行ETL
  • 进行分析(尽管您应该在数据库中进行分析,而不是在客户端进行分析)

具体而言,数据库中的Hibernate doesn't offer any way to keep a lazy cursor并像JDBC或其他一些ORM一样懒惰地滚动它。但它并不需要。你总是可以在Hibernate项目中使用普通的JDBC。