暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

fetchsize-pg与oralce用法区别

IT那活儿 2020-12-11
1348

测试代码准备

Oracle环境准备

Pg环境准备

运行脚本

oracle环境执行

java-Xmx64m -Xms32m -Xmn32m -Xss16m TEST "wangt" "wangt""jdbc:oracle:thin:@(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=orcl))(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))">a.txt

postgres环境执行

修改fetchsize后运行脚本

oracle环境执行

java-Xmx64m -Xms32m -Xmn32m -Xss16m TEST2 "wangt" "wangt""jdbc:oracle:thin:@(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=orcl))(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))">c.txt

postgres环境执行

java-Xmx64m -Xms32m -Xmn32m -Xss16m TEST2 "postgres" "wangt""jdbc:postgresql://localhost:5432/wangt">b.txt

总结

JDBC解析SQL语句后,为每个Statement(包括PreparedStatement和CallableStatement)分配了两个Buffer缓存数据,byte[]和char[]。字符类型的数据(CHAR,VARCHAR2,NCHAR, etc. )缓存在char[]中,其他类型的数据缓存在byte[]中。在SQL语句解析后,语句所查询的列的数据类型就已经确定了,JDBC会根据这些信息和FetchSize 一起计算出缓存的大小,并分配内存。所以如果不需要查询某张表的所以列时,使用SELECT* FROM XXX是一种浪费内存的行为,特别是表的列数多且数据量大的时候,很容易造成OOM,代码也很少有select*。

通过以上测试可知,fetchsize的设置影响到jvm内存消耗和查询的响应时间,设置fetchsize时要权衡两者。一般jdbc默认的fetchsize是10,这个值是比较小的,可以防查询时outof momory的问题,但是程序的响应时间会变长。字段多的表或者行数大的表需要一个小的fetchsize值来降低查询结果集的jvm内存消耗;但是,字段少或者行数据小的表需要一个大的fetchsize值来降低查询结果集的响应时间。要设置fetchsize,请在执行查询之前,对statement对象调用setFetchSize()。如果fetchsize为N,那么每次往返数据库能返回N行数据。

案例

oracle迁移后,导出报表数据显示如下报错,因为oracle的fetchsize有默认值,所以可以导出,虽然比较慢。pg中默认值是0,全部写到内存中,服务器内存不足,提示OOM。设置fetchsize后程序可以和往常一样导出数据。

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论