Java JDBC(mysql)将查询保存在堆内存中

Java JDBC(mysql)将查询保存在堆内存中,java,mysql,jdbc,Java,Mysql,Jdbc,我正在尝试对一个包含12500000条记录的表上的数据库运行Hibernate搜索 启动时,Hibernate Search查询数据库以获取模式信息 问题是我得到了OutOfMemory:堆大小异常 我四处阅读,发现MySQL的JDBC连接器将查询放在JAVA堆内存上,这是一个bug 这个bug有工作区吗 我使用的是5.1连接器 请看我在Hibernate论坛上的帖子,他们在那里写道MySQL中有一个bug 问题是我如何在它周围工作?如果内存不足,就不一定是一个bug,可能只是没有足够的内存分

我正在尝试对一个包含12500000条记录的表上的数据库运行Hibernate搜索

启动时,Hibernate Search查询数据库以获取模式信息

问题是我得到了OutOfMemory:堆大小异常

我四处阅读,发现MySQL的JDBC连接器将查询放在JAVA堆内存上,这是一个bug

这个bug有工作区吗

我使用的是5.1连接器

请看我在Hibernate论坛上的帖子,他们在那里写道MySQL中有一个bug


问题是我如何在它周围工作?

如果内存不足,就不一定是一个bug,可能只是没有足够的内存分配给Java。堆空间是存储对象中数据的地方,JDBC连接是一个对象。如果代码正确,并且只需要更多堆空间,请增加堆的大小

java-Xms-Xmx


如果这不能解决问题,代码可能会有更深层次的问题;有些东西正在吞噬不该被遗忘的记忆。在不断增加内存之前找到问题;否则,您只是在这个问题上暂时包扎,包扎可能不会持续很久。

数据库元数据不需要太多内存。使用探查器启动应用程序,您将立即看到内存是如何使用的。

我找到了解决方案

在MySQL中,我必须添加到连接字符串:

&useServerPrepStmts=true&useCursorFetch=true

默认情况下,此选项启用流式处理结果。

我使用堆大小1200MB运行它-最大值针对代码运行探查器工具,查看它在哪里占用内存。模式信息不应该占用接近这个RAM量的任何地方。