在使用PostgreSQL JDBC处理大型结果集时,正确配置fetch size对于优化性能和内存使用至关重要。最近我们在国产化改造过程中总有一些差异导致应用性能问题,有时不只在数据库还可能在驱动中,如分页查询或其他OLTP场景,我们总希望尽快的返回结果,这里我分享一下Oracle和Postgresql JDBC 默认fetchsize 从服务向客户端发送数据的差异。
Oracle 和PostgreSQL JDBC fetch差异
首先Oracle Jdbc中的resultSet是『服务器』端的游标, 默认是一个SQL 流式执行,而不是缓冲区,可以从大量结果中读取几行数据返回,而不用等待整个结果完成就开始处理。但是这种可能在Fetch了几批后表不存在了执行报错,或直接MVCC的快照过久,直接ORA-1555, 当然还可能因为没有合理的增加Fetchsize, 结果在服务和客户端频繁的往返传递数据和上下文切换时间。但是在PostgreSQL JDBC中它不是『服务器』端游标,而是客户端缓存,当执行第一次java中调用 rs.next()时,等整合结果返回到客户端,导致初始响应过长,尤其是应用端使用set对象的分页查询,还可能会占用更大的内存,当然PostgreSQL中可以配置fetchsize 来改善这个场景的性能。