使用 MySQL 流式传输大型结果集
在 MySQL 中处理大型表时,由于默认值,可能会出现过多的资源消耗和内存错误JDBC 驱动程序将整个结果集加载到内存中的行为。为了缓解这种情况,必须实施适当的流数据技术,而不是一次加载全部数据。
方法
提供的问题建议使用statement.setFetchSize(Integer .MIN_VALUE);限制数据加载,但仅此还不够。根据 MySQL JDBC 驱动程序文档,将结果集设置为 TYPE_FORWARD_ONLY 和 CONCUR_READ_ONLY 对于有效的流处理是必要的:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
但是,需要注意的是,这种方法有潜在的缺点:
进一步注意事项
如果将结果集设置为 TYPE_FORWARD_ONLY 和 CONCUR_READ_ONLY 并不能解决内存问题,根本原因可能是是数据在处理之前在 Java 内存中的存储。为了解决这个问题,需要立即处理传入的数据,这可能涉及大量的代码修改。有关更多信息,请参阅答案中提供的链接,该链接解决了类似的问题。
以上是如何高效地传输大型 MySQL 结果集以避免内存错误?的详细内容。更多信息请关注PHP中文网其他相关文章!