javamysql-jdbc与Hibernate关于Select查询的实现

javamysql-jdbc与Hibernate关于Select查询的实现,java,mysql,hibernate,Java,Mysql,Hibernate,很抱歉这个模糊的问题,因为我不知道如何用合适的句子来写,如果你们中有人想把它编辑成更有意义的东西,请继续 我实际上想问,当我们做这样的事情时: Select * from TableWithBillionRecords Limit 1000000 使用任一结果集: PreparedStatement.executeQuery() 或休眠: getCurrentSession().createQuery(query).list() 一旦执行该行,是否意味着web服务器实际上正在从我的数据库服

很抱歉这个模糊的问题,因为我不知道如何用合适的句子来写,如果你们中有人想把它编辑成更有意义的东西,请继续

我实际上想问,当我们做这样的事情时:

Select * from TableWithBillionRecords Limit 1000000
使用任一结果集:

PreparedStatement.executeQuery()
或休眠:

getCurrentSession().createQuery(query).list()
一旦执行该行,是否意味着web服务器实际上正在从我的数据库服务器中取出全部100万行?或者界面背后是否存在一些流逻辑

感谢您提供的信息,因为它帮助我决定是否应该将其拆分为多个查询,选择一块一块地进行查询,或者只选择一整组就可以了


再次感谢各位。

大多数JDBC驱动程序的默认获取大小是10

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

原因是JDBC驱动程序设计用于从数据库获取少量行,以避免任何内存不足问题

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

若将fetch size配置为100,则到数据库的网络访问次数将变为10。这将显著提高应用程序的性能

<强>当调整获取大小时要考虑的重要注意事项:< /强>

  • 确保JDBC驱动程序支持配置获取大小
  • 获取大小应基于JVM堆内存设置。由于JVM堆大小在不同的环境中有所不同,所以不要硬代码获取大小将其保留为可配置参数
  • 如果提取大小较大,则可能会遇到内存不足问题。例如,支持大行获取大小的列表数量可能少于支持较多列的列表数量
  • 您可以根据特定的数据类型(如blob、image等)设置获取大小。我们遵循特定的列命名约定,例如,所有image和blob列都有后缀“blob”。如果查询不包含“Blob”字,我将设置高获取大小,否则将设置低获取大小
  • 请参阅:

    默认情况下会急切地获取结果,因为与数据库的大多数交互往往是这样的:获取两条记录,显示它们,可能会修改它们,然后再次存储它们

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

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

    特别是,在数据库中,像JDBC或其他一些ORM一样缓慢地滚动它。但它不需要。在Hibernate项目中,您始终可以使用普通的JDBC。

    搜索JDBC分页Hibernate是JDBC之上的一种更高级别的ORM。我不熟悉Hibernate,但在JDBC中,您可以使用setFetchSize()来获得有效的分块。@seand setFetchSize(Integer.MIN_VALUE)看起来很有希望,但可以确定的是,逐行“流”表示只有一个连接,对吗?如果是这样的话,那真是太棒了。。