流式传输大型 MySQL 结果集
问题描述
在 a 中加载大型 MySQL 表时Spring应用程序中,由于驱动程序尝试将整个表加载到内存中而发生OutOfMemory异常。尽管将获取大小设置为 Integer.MIN_VALUE,但关闭 ResultSet 会导致挂起问题。即使对于小表,挂起也会持续存在,并阻止关闭连接,从而导致以下堆栈跟踪:
[Stack trace of the hang inserted here]
解决方案
仅设置提取大小是不够的。 MySQL JDBC 驱动程序需要特定的语句创建方法:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
注意事项和含义
此方法有几个注意事项:
其他注意事项
如果 OutOfMemory 异常仍然存在,请考虑立即实施处理从数据库检索的数据以避免过多的内存分配。这可能需要大量的代码重组和不同的流程控制方法。
以上是如何在 Spring 中高效地传输大型 MySQL 结果集而不出现 OutOfMemory 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!