gpt4 book ai didi

Hibernate .getResultStream() 没有流式传输?

转载 作者:行者123 更新时间:2023-12-02 16:46:54 24 4
gpt4 key购买 nike

我正在尝试通过 .getResultStream() 使用 Hibernate 从 MySQL 流式传输大量数据,但出现了 OutOfMemoryErrors。

一段时间后在第一行加载时,我会在可以看到的地方得到这个异常:

    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1963) ~[mysql-connector-java-5.1.37.jar:5.1.37]
at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3308) ~[mysql-connector-java-5.1.37.jar:5.1.37]
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:463) ~[mysql-connector-java-5.1.37.jar:5.1.37]
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3032) ~[mysql-connector-java-5.1.37.jar:5.1.37]
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2280) ~[mysql-connector-java-5.1.37.jar:5.1.37]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673) ~[mysql-connector-java-5.1.37.jar:5.1.37]

令我惊讶的是 readAllResults - 这似乎不是真正的流。

我也尝试过使用:

query.setHint("org.hibernate.fetchSize", 1000)

没有效果。

然后我升级到 MySQL Connector 8.0.19 和 Hibernate 5.4.11.Final,效果相同。

最佳答案

有趣的是,接受的答案是错误的。正如 Mikko 所提到的,JPA 规范将实现留给了供应商,而 Hibernate 实际实现了它,请参阅 Query QueryImpl 实现的类。

现在,原因在于 MySQL 的行为方式。如所述here , MySQL 默认加载所有结果到内存。您有 2 个选项,请在此处查看 -> https://vladmihalcea.com/whats-new-in-jpa-2-2-stream-the-result-of-a-query-execution/

基本上,要么将语句提取大小设置为 Integer.MIN_VALUE,然后每条记录将一个接一个地提取,或者将 useCursorFetch 连接属性设置为 true,然后您可以将语句提取大小设置为正整数值(或设置 defaultFetchSize 连接属性,这样你就不需要为每个查询定义)

关于Hibernate .getResultStream() 没有流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com