程序访问 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。
其实在 数据库中提供了流式查询,允许把符合条件的数据分批一部分一部分地加载到内存中,可以有效避免OOM;本文主要介绍如何使用流式查询并对比普通查询进行性能测试。
使用JDBC的 的 方法设置为 或者使用方法 可以实现流式查询,在执行 方法时,会通过数据库连接一条一条的返回,这样也不会大量占用客户端的内存。
PS:上面的例子中通过参数 来切换 流式查询与 普通查询,用于下面做测试对比。
创建了一张测试表 进行测试,总数据量为 条,分别使用以下4个测试用例进行测试:
- 大数据量普通查询(27w条)
- 大数据量流式查询(27w条)
- 小数据量普通查询(10条)
- 小数据量流式查询(10条)
3.1. 测试大数据量普通查询
3.1.1. 查询耗时
DEMO地址:https://github.com/zlt2000/mysql-stream-query