关系型数据库批量取数,fetchSize相关设置调研,mysql、pg、sqlserver、oracle_resultset的fetchsize越大-CSDN博客
【PostgreSql】解决postgresql设置fetchsize也无法流查询的思路及方案_postgresql 流式查询_zhousenshan的博客-CSDN博客
PostgreSQL JDBC 源码分析之fetchSize_postgresql setfetchsize-CSDN博客
MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现_mysql 游标查询_赵丙双的博客-CSDN博客
一、总结下来,如果PostgreSql想要使用游标查询的话,需要以下几个条件
1、fechSize设置需要 > 0
3、需要设置autocommit为false
2、jdbc连接字符串不能加 preferQueryMode =simple 【我测试不影响是否是流查询】
如何判断是否是流查询:
1、org.postgresql.jdbc.PgStatement.executeInternal 方法 判断为true: this.fetchSize > 0 && !this.wantsScrollableResultSet() && !this.connection.getAutoCommit() && !this.wantsHoldableResultSet()
2、打断点 query:65, PreparedStatementHandler (org.apache.ibatis.executor.statement),看下ps.result.rs.rows 的size 是否等于 fetchSize
二、JDBC流式查询模式
1.创建 PreparedStatement 对象时,需要设置 ResultSet 类型为 TYPE_FORWARD_ONLY,设置 ResultSet 并发模式为 CONCUR_READ_ONLY:
PreparedStatement pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
2.通过 setFetchSize() 方法设置每次从数据库中获取的记录数:
pstmt.setFetchSize(fetchSize);
3.
执行查询语句后,通过 ResultSet 对象的 next() 方法逐条获取查询结果:
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
// 处理查询结果
}
需要注意的是,在使用流式查询模式时,ResultSet 对象的一些方法可能会失效,比如 absolute()、last()、previous()、beforeFirst() 等方法。此外,流式查询模式只适用于查询,不适用于更新、插入、删除等操作。