数据库流查询

 关系型数据库批量取数,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() 等方法。此外,流式查询模式只适用于查询,不适用于更新、插入、删除等操作。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值