使用JDBC查询数据库会一次性加载所有数据吗
前几天有个小伙伴说他有个疑问:当我们发起一个查询的时候,数据库服务器是把所有结果集都准备好,然后一次性返回给应用程序服务吗(因为他们生产有个服务因为一个报表查询搞宕机了)。
这样想的原因很简单,假设那个报表查询出来有几百万数据,然后一次性倾泻给应用程序了,应用没那么大内存空间,而且同时还要兼顾处理其他请求,直接就导致内存溢出,此服务不可用了。~~~最有效的办法当然时优化这种报表SQL。
- 说回他的疑问,真的时一次性返回所有数据吗,答案是不一定。在JDBC的规范中并没有规定与DBMS交互过程中,每次返回多少记录数据,而是在Statement、ResultSet接口中提供了setFetchSize方法让具体的数据库厂商自行实现每次返回的结果集。或者不设置的时候数据库厂商也许会实现使用流式处理方式读取数据
主要是用来减少数据库服务和应用查询服务之间网络交互次数,不至于一次值返回一行让客户端接受解析,也避免大数据传输时一次过多的数据而影响性能。 当设置了FetchSize时,服务器每次返回设置大小的结果集给客户端缓存起来,然后客户端使用ResultSet的next()方法从本地缓存中读取并解析和填充这些数据。之后再次next()时再重新从数据库服务器请求获取数据,就像游标一样,读取下一个游标
不同数据库的不同默认实现:
1. oracle的实现(比如ojdbc6),ojdbc中默认的fetchSize是10
2. mysql中因版本不同也有差异,MySQL Connector/J 5.1.13及更高版本中,对Statement对象,默认的Fetch Size被设置为Statement.DEFAULT_FETCH_SIZE,其值为0,这意味着驱动程序将尝试使用最佳性能策略,通常采用流式处理方式从服务器端按需读取数据,而不是一次性加载所有数据。而比较早的版本,可能一次性加载所有结果
3. SQLServer,也就是sqljdbc的实现,从6.0开始支持这个设置。默认值设置为-1。这个值表示驱动程序会尝试使用服务器端的最佳性能策略来处理结果集,而不是一次性加载所有数据到客户端。这意味着在大多数情况下,它会采用流式读取的方式。
常用的数据持久化框架都支持设置,
比如Mybatis:
<select id="queryOrder" fetchSize="200"> SELECT * FROM my_tb </select>
或者高版本的注解实现:3.4.1以上
@Select("SELECT * FROM my_tb")
@Options(fetchSize = 200)
List queryOrder();
使用JDBC查询数据库会一次性加载所有数据吗的更多相关文章
- 参考 ZTree 加载大数据量。加载慢问题解析
参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...
- Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)
Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子 时间:2012-11-20 17:54:02 Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...
- 用JDBC查询数据库
JDBC API的核心组件:1.DriverManager类:用语跟踪可用的JDBC驱动程序并产生数据库连接. 2.Connection接口:用于取得数据库信息.生成数据库语句,并管理数据库事务. 3 ...
- buttongroup中content一次性加载的解决方法
buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...
- 关于VS连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案。
错误一.关于VS连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案. ...
- jeecgboot-vue3笔记(八)——treeSelect树形选择组件的使用(一次性加载)
使用效果 前端代码 定义interface export interface TreeDataItem { value: string; key: string; title?: string; sl ...
- Flink 中定时加载外部数据
社区中有好几个同学问过这样的场景: flink 任务中,source 进来的数据,需要连接数据库里面的字段,再做后面的处理 这里假设一个 ETL 的场景,输入数据包含两个字段 “type, useri ...
- dhtmlxtree动态加载节点数据的小随笔
最近做了一个这个东西,颇有些感触,随笔记录一下自己的过程. 首先特别感谢:https://blog.csdn.net/cfl20121314/article/details/46852591,对我的帮 ...
- Learning Spark中文版--第五章--加载保存数据(2)
SequenceFiles(序列文件) SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新 ...
- Tree:加载列表数据
Tree控件,需要提供一个树形的JSON数据,才能正常显示. 通常,开发者在后台可以这样做: 1)从数据库查询出一个列表数据 2)在后台,将列表数据转换为树形数据 3)通过JSON方式返回 在前台页面 ...
随机推荐
- [FLET] 02 route 测试
from typing import Dict import flet from flet import AppBar, ElevatedButton, Page, Text, View, color ...
- ubuntu podman相关
前言 记录podman的安装.配置以及一些常用操作,会不定时更新: 正文 1. podman 安装以及配置 ubuntu 安装 podman sudo apt update sudo apt inst ...
- Nginx 高性能架构解析
本文详细探讨了Nginx的反向代理.负载均衡和性能优化技术,包括配置优化.系统优化.缓存机制和高并发处理策略,旨在帮助专业从业者深入理解并有效应用Nginx. 关注TechLead,复旦博士,分享云服 ...
- Serverless无服务应用架构纵横谈2:边缘计算激战正酣
Serverless无服务应用架构纵横谈2 前言 6年前,我写了一篇<Serverless无服务应用架构纵横谈>. 文中说到无论是公有云FaaS还是私有云FaaS,都不是云计算的未来. 因 ...
- 如何立刻读取在MySQL中自动生成的主键
在写一个接口时,我们需要对两个表分别动刀,但是我们需要前一个表的主键作为下一个表的功能外键, 如果使用mybatisplus,insert完成之后便可以直接在对象中取出这个id值 如果使用mybati ...
- 【JavaScript】前端算法题(重建二叉树、反向输出链表每个节点)
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树.反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的 ...
- 【Java】 WebService 校验机制
测试环境域名 不可见 正式环境域名 不可见 1.2.安全校验凭证 accessId(授权ID) 测试/正式待定 securityKey(加密密钥) 测试/正式待定 1.3.安全校验机制 1.3.1.在 ...
- OpenAI —— CLIP: Connecting text and images
项目地址: https://openai.com/index/clip Github代码地址: https://github.com/openai/CLIP
- 论文写作:写回复意见时的套话 (reviews and comments)
Typos, Grammar, and Citation Errors: We acknowledge the need for a thorough proofreading to rectify ...
- 树莓派 3b+型号 pip3方式 安装 TensorFlow
树莓派系统为: 首先选择 pip3 方式进行安装: 树莓派上执行: 发现速度过慢,于是选择先在Windows主机上下载,然后再把文件传到树莓派上进行安装. 不过后来发现即使使用迅雷这样强大的下载工具 ...