我们的应用程序可能会根据客户基础架构运行多个数据库 我们使用Hibernate orm,因此我们可以在各种RDBMS上部署我们的应用程序。
我们注意到在使用MySql数据库的所有环境中都存在异常的内存消耗。
分析我们在使用可滚动结果时会看到它引发的问题。 与其他环境(SQL server,Oracle,....)相反,它看起来像MySql中的可滚动结果立即获取查询的所有结果。
据我所知,我在Oracle和SQL Server中看到,当您使用可滚动结果时,游标处于打开状态,只有在调用next()
方法时才从数据库服务器获取行。我们所有的游标都是'FORWARD_ONLY。
我认为原因是MySql-jdbc-connector没有正确处理可滚动结果。 那是对的吗? 我可以在MySql上正确运行可滚动结果吗?如果是的话,怎么样? 提前感谢任何人
答案 0 :(得分:1)
是的,显然MySQL默认缓存ResultSet数据,因为它是最有效的方式 https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-implementation-notes.html
默认情况下,ResultSet完全检索并存储在内存中。 在大多数情况下,这是最有效的操作方式,并且由于 MySQL网络协议的设计更容易实现。
您可以尝试:query.setFetchSize()
,它将提供有关您的要求的基础jdbc提示。
但这一切都取决于驱动程序,有些人可能实际上只是忽略它并继续获取所有内容