Java JDBC(mysql)将查询保存在堆内存中
我正在尝试对一个包含12500000条记录的表上的数据库运行Hibernate搜索 启动时,Hibernate Search查询数据库以获取模式信息 问题是我得到了OutOfMemory:堆大小异常 我四处阅读,发现MySQL的JDBC连接器将查询放在JAVA堆内存上,这是一个bug 这个bug有工作区吗 我使用的是5.1连接器 请看我在Hibernate论坛上的帖子,他们在那里写道MySQL中有一个bugJava JDBC(mysql)将查询保存在堆内存中,java,mysql,jdbc,Java,Mysql,Jdbc,我正在尝试对一个包含12500000条记录的表上的数据库运行Hibernate搜索 启动时,Hibernate Search查询数据库以获取模式信息 问题是我得到了OutOfMemory:堆大小异常 我四处阅读,发现MySQL的JDBC连接器将查询放在JAVA堆内存上,这是一个bug 这个bug有工作区吗 我使用的是5.1连接器 请看我在Hibernate论坛上的帖子,他们在那里写道MySQL中有一个bug 问题是我如何在它周围工作?如果内存不足,就不一定是一个bug,可能只是没有足够的内存分
问题是我如何在它周围工作?如果内存不足,就不一定是一个bug,可能只是没有足够的内存分配给Java。堆空间是存储对象中数据的地方,JDBC连接是一个对象。如果代码正确,并且只需要更多堆空间,请增加堆的大小
java-Xms-Xmx
如果这不能解决问题,代码可能会有更深层次的问题;有些东西正在吞噬不该被遗忘的记忆。在不断增加内存之前找到问题;否则,您只是在这个问题上暂时包扎,包扎可能不会持续很久。数据库元数据不需要太多内存。使用探查器启动应用程序,您将立即看到内存是如何使用的。我找到了解决方案 在MySQL中,我必须添加到连接字符串:
&useServerPrepStmts=true&useCursorFetch=true
默认情况下,此选项启用流式处理结果。我使用堆大小1200MB运行它-最大值针对代码运行探查器工具,查看它在哪里占用内存。模式信息不应该占用接近这个RAM量的任何地方。