当前位置: 首页 > news >正文

jdbc通信原理

一、普通查询(默认行为)
正确流程
JDBC客户端通过Socket与MySQL服务器建立TCP连接。

客户端发送SQL查询语句。

MySQL服务器执行查询,将结果集数据从存储引擎读出,放入服务器内核的发送缓冲区(位于操作系统内核空间)。

服务器内核通过TCP协议将数据分段,经网络传输到客户端机器。

数据到达客户端网卡后,由内核放入客户端内核的接收缓冲区(即Socket缓冲区,位于内核空间)。

JDBC驱动执行read()系统调用,从该内核缓冲区读取数据到驱动内部缓冲区(用户空间,可选),再复制到JVM堆内存中的对象(如ResultSet的行缓存)。

默认情况下,JDBC驱动会一直读取直到所有数据到达,executeQuery()才返回ResultSet对象。这意味着所有结果集数据都已加载到JVM内存中。

二、游标查询(Cursor Query)
正确描述
定义:MySQL的游标查询通过在连接URL中添加useCursorFetch=true并设置fetchSize来启用。它使用服务器端游标(materialized cursor),服务器将结果集暂存于临时表或内存中,客户端多次主动FETCH获取数据。

流程:

客户端发送查询,MySQL服务器创建游标并将结果集物化(写入临时文件或内存表)。
服务器只返回第一行或第一批数据(由fetchSize决定),而不是全部结果。
客户端每次调用rs.next(),当本地缓存用完时,驱动自动发送FETCH命令获取下一批。
服务器从临时存储中读取下一批数据返回。
资源开销:

服务器端:需要额外的磁盘I/O或内存来存储完整结果集(尤其是大结果集),并维护游标状态。

网络:多次往返交互(每批一次请求-响应)。

客户端:内存中只保留当前批次,避免OOM。

三、流式查询(Streaming Query)
正确描述
定义:流式查询指服务器边生成结果边发送,无需物化完整结果集,客户端以流的方式持续接收。不同数据库实现不同:

PostgreSQL:设置fetchSize后,使用协议级别的“门户”实现真正的流式,服务器无状态,数据边查边发。

MySQL:实际上并没有真正的流式查询,其“流式”是通过游标模拟的(服务器端仍需物化,但客户端分批拉取)。MySQL官方文档中提到的“流式”通常指设置fetchSize为Integer.MIN_VALUE(旧版本)或使用游标。

流程(以PostgreSQL为例):

客户端发送查询并指定fetchSize。
服务器开始执行查询,每生成一批数据(例如100行)就立即通过TCP连接发送给客户端。
客户端驱动接收数据并放入JVM,应用程序通过rs.next()消费。
服务器继续生成下一批并发送,直到全部发完。
特点:

服务器无需物化完整结果集,节省I/O和内存。

网络通信为“推”模式,一次请求,多次响应。

客户端处理速度可能影响服务器发送:如果客户端读取慢,TCP滑动窗口会反压服务器,导致服务器阻塞(发送缓冲区满)。

五、总结与建议
普通查询适合小结果集,简单高效;大结果集必须改用游标/流式。

MySQL用户:使用useCursorFetch=true + fetchSize实现游标查询,注意服务器额外I/O开销。

PostgreSQL用户:直接设置fetchSize即可获得真正的流式体验。

设计考虑:如果数据量极大且服务器资源紧张,流式(无物化)更优;如果需要精确控制分批且数据库支持游标,游标查询也足够。

希望这份优化后的笔记能帮你理清概念。如果还有疑问,欢迎继续探讨!

http://www.jsqmd.com/news/489670/

相关文章:

  • 目标函数(含罚函数处理)
  • JavaScript性能优化实战鼻堑
  • 安装 OpenClaw 时网络怎么配置?一篇讲清模型接入与代理设置
  • JavaScript性能优化实战耙暮
  • 【前端】最好用的本地组件库调试工具 yalc
  • 2026最新版 Android Studio 安装与配置全教程(保姆级)
  • 篇关于电脑cmd命令符开发代码的技术文章大纲
  • 人工智能代理AI Agent如何自动化CRM、Jira、计费和Slack之间的工作流程
  • 深刻理解HTTP
  • MinorGC的完整流程与复制算法深度解析
  • 企业用智能体要投入多少成本?2026避坑指南与主流产品横评
  • 2026年沈阳路灯厂TOP10榜单揭晓,哪家实力最强?
  • API 安全: 保护 AI 应用的交互接口
  • 分治算法应用:逆序计数(Counting Inversions)
  • 跨平台方案:Java如何支持多终端文件夹的目录结构分片上传与信创国产化适配?
  • Java 中 Date 与 LocalDate 的区别
  • cmu15445 25fall lec3个人笔记
  • 基于springboot的社交媒体平台的设计与实现
  • 揭秘:用分期乐2000元支付宝立减金回收的最佳方法 - 团团收购物卡回收
  • 海参最吸收的营养做法
  • 全域GEO源码系统开源,三大核心模块:语义显式化、结构化数据生成
  • 从零开始搭建 Logto 详细教程!
  • C语言:通用高级编程语言,现代编程语言母语及应用领域介绍
  • AI原生软件时代,中小软件公司的生存破局之路
  • ABB RobotStudio 工件坐标创建、程序加载与仿真运行:全面解析与实践指南
  • C语言介绍:起源、特性、应用领域及如何为学其他语言打基础
  • 拒绝做 AI 的 “饲养员”:前端程序员在 AI 时代的生存与进化指南
  • Node安装及卸载
  • LP3783A芯茂微5V2.1A低功耗原边反馈充电器芯片替代PL3378/C
  • S4-Info-Yi系统的数学接口缺失、补全及在薛定谔猫佯谬中的应用