java - hibernate 可滚动结果立即获取mysql中的所有行

标签 java mysql hibernate mysql-connector

我们的应用程序可能会运行在多个数据库上,具体取决于客户的基础设施。 我们使用 Hibernate orm,因此我们可以在各种 RDBMS 上部署我们的应用程序。

我们注意到在所有使用 MySql 数据库的环境中,我们都存在异常的内存消耗。

分析我们发现使用可滚动结果时出现的问题。 与其他环境(SQL 服务器、Oracle 等)相反,它看起来像 MySql 中的可滚动结果会立即获取所有查询结果。

据我所知,我在 Oracle 和 SQL Server 中看到,当您使用可滚动结果时,游标会打开,并且只有在调用 next() 方法时才会从 DB 服务器获取行.我们所有的游标都是`FORWARD_ONLY。

我认为原因是 MySql-jdbc-connector 没有正确处理可滚动结果。 那是对的吗? 我可以让滚动结果在 MySql 上正常工作吗?而且,如果是,如何? 在此先感谢任何人

最佳答案

是的,显然 MySQL 默认缓存 ResultSet 数据,因为这是最有效的方式 https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-implementation-notes.html

By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate and, due to the design of the MySQL network protocol, is easier to implement.

你可以试试:query.setFetchSize(),它会给底层的jdbc提示你的要求。 但这完全取决于驱动程序,有些人实际上可能只是忽略它并继续获取所有内容

关于java - hibernate 可滚动结果立即获取mysql中的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582174/

相关文章:

java - 如何在 hibernate 中不更新 ddl 架构

java - 我想在java中使用XQuery For Xml处理

java - 如何从 Swift 原生代码到 Flutter 的 'put' 参数

java - 与 Tomcat 的双向 SSL 通信

php - 在 codeigniter 中将查询保留在 "VIEW"之外

mysql - SQl查询连接具有相同ID但具有相同日期字段的不同值的多行

mysql - 使用 C3P0 的 Hibernate 在 Oracle 上运行良好,但不关闭与 MySQL 5.6 的连接

java - 如何在类路径之外覆盖 spring Activity 配置文件?

mysql - 禁用特定用户/模式的查询缓存?

Hibernate:Criteria API 与 QueryDsl