GBase 8a采用流模式处理JDBC大结果集,避免内存不足 OutOfmemoryError: GC overhead limit exceeded

当使用JDBC处理GBase 8a的大结果集时,可能出现`OutOfMemoryError: GC overhead limit exceeded`。解决方法是设置ResultSet为只前进不后退的流模式,通过`ResultSet.TYPE_FORWARD_ONLY`和`ResultSet.CONCUR_READ_ONLY`,并使用`setFetchSize(Integer.MIN_VALUE)`来实现数据的逐行读取,减少内存消耗。注意,长时间处理一行数据可能导致服务器发送数据超时,此时需关注服务器参数`gcluster_send_client_date_timeout`,避免客户端阻塞导致的问题。
摘要由CSDN通过智能技术生成

报错样例
java.lang.OutOfMemoryError: GC overhead limit exceeded

内存不足,垃圾回收超过限制次数了。
在这里插入图片描述

解决方案
因为jdbc默认是将所有结果集都缓冲到本地,以便提供前进,后退的双向移动功能,但会占用大量内存。如果业务上只有前进(next),则可以采用每次只读取最小单位数据,处理完了再读取下一部分,来减少内存的消耗。

这个问题,对任何数据库都存在。

ResultSet.TYPE_FORWARD_ONLY, 表示只会前进,不会后退。
ResultSet.CONCUR_READ_ONLY 表示数据只读,不会更新。
setFetchSize 指定每次读取的最小值,一行一行的处理。注意,这里Integer.MIN_VALUE隐藏了含义,一般都是流模式的开关。如果改成其它数字,请做详尽的测试确保内存使用符合要求。

Statement stat = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stat.setFetchSize(Integer.MIN_VALUE);
提示
如果你读取一行,处理一行,而且处理一行数据时间过长,会导致服务器端发送数据超时,需要参考以下内容:

参数
gcluster_send_client_date_timeout=30

当服务器向客户端发送数据时࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值