PostgreSQL jdbc查询百万数据导致OOM

1、在微服务的yml中已配置 url: jdbc:postgresql://${db_ip}:${db_port}/${db_name}?useCursorFetch=true&defaultFetchSize=10000,意思是在获取到的ResultSet按游标滚动,每次取10000条记录,避免占用应用内存过大,导致OOM。实测结果仍为JDBC一次性取出全部200万记录。

2、查阅https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters发现参数为defaultRowFetchSize,修改为url: jdbc:postgresql://${db_ip}:${db_port}/${db_name}?useCursorFetch=true&defaultRowFetchSize=10000,仍然是一次取出全部记录。

3、在代码中将Statement stmt.setFetchSize(10000),仍然是一次取出全部记录。

4、将connection的autoCommit设置为false,Statement 设为仅向前滚动,每次取出10000条,执行完成再connection设回autoCommit=true,问题解决。每次只取10000条,达到节省内存的目的。    

connection.setAutoCommit(false);
Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.FETCH_FORWARD);
stmt.setFetchSize(10000);
ResultSet rs = stmt.executeQuery(sql);
connection.setAutoCommit(true);

本文适用于数据查询返回记录数多,并发查询多,但微服务内存有限制的应用。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值