前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DBeaver客户端工具结果集缓存实现的猜测

DBeaver客户端工具结果集缓存实现的猜测

作者头像
bisal
发布2021-12-30 17:46:14
1.1K0
发布2021-12-30 17:46:14
举报

MySQL客户端预读数据的区别》文章中提到了DBeaver设置"集数获取大小",我猜测是通过在执行的SQL上添加limit得到的,

9fcf889d02be9451f501a604700711ec.png
9fcf889d02be9451f501a604700711ec.png

有朋友的评论说,可能用到了jdbc流式查询,

fcdc96f7d81d483036c45440e44a50f3.png
fcdc96f7d81d483036c45440e44a50f3.png

针对MySQL,JDBC驱动不支持像Oracle中使用的fetchSize缓冲区,但是如果设置PreparedStatement的setFetchSize为Integer.MIN_VALUE,或者使用方法Statement.enableStreamingResults(),就可以实现流式查询,即执行ResultSet.next()方法时,会通过数据库连接一条一条的返回,不会大量占用客户端的内存,导致OOM。

我们知道,MySQL支持limit功能,limit子句可以强制SELECT语句返回指定的记录数,limit接受一个或两个数字参数,参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目,初始记录行的偏移量是0(而不是1),

代码语言:javascript
复制
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

几个例子,

代码语言:javascript
复制
// 初始记录行的偏移量是0,因此,检索记录行6-15,
SELECT * FROM table LIMIT 5, 10;  
  
// 为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为-1,
// 检索记录行 6-last.
SELECT * FROM table LIMIT 5, -1;   
  
// 如果只给定一个参数,他表示返回最大的记录行数目,
// 检索前5个记录行
// LIMIT n等价于LIMIT 0, n
SELECT * FROM table LIMIT 5;

因此,从功能上,如果针对MySQL,流式查询和limit,应该都可以实现DBeaver的功能,但是从通用性上,显然JDBC的功能,更加通用和简单,毕竟不是所有的数据库都支持limit,尽管存在他的替代方案,但这会让处理逻辑更加复杂。当然,纠结这个问题,其实没什么意义,能理解这些检索数据的方法和原理,不同的场景下,选择合适的方法,这才是更重要的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档