前几天有个小伙伴说他有个疑问:当我们发起一个查询的时候,数据库服务器是把所有结果集都准备好,然后一次性返回给应用程序服务吗(因为他们生产有个服务因为一个报表查询搞宕机了)。

这样想的原因很简单,假设那个报表查询出来有几百万数据,然后一次性倾泻给应用程序了,应用没那么大内存空间,而且同时还要兼顾处理其他请求,直接就导致内存溢出,此服务不可用了。~~~最有效的办法当然时优化这种报表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查询数据库会一次性加载所有数据吗的更多相关文章

  1. 参考 ZTree 加载大数据量。加载慢问题解析

    参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...

  2. Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

    Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子   时间:2012-11-20 17:54:02   Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...

  3. 用JDBC查询数据库

    JDBC API的核心组件:1.DriverManager类:用语跟踪可用的JDBC驱动程序并产生数据库连接. 2.Connection接口:用于取得数据库信息.生成数据库语句,并管理数据库事务. 3 ...

  4. buttongroup中content一次性加载的解决方法

    buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...

  5. 关于VS连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案。

    错误一.关于VS连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案. ...

  6. jeecgboot-vue3笔记(八)——treeSelect树形选择组件的使用(一次性加载)

    使用效果 前端代码 定义interface export interface TreeDataItem { value: string; key: string; title?: string; sl ...

  7. Flink 中定时加载外部数据

    社区中有好几个同学问过这样的场景: flink 任务中,source 进来的数据,需要连接数据库里面的字段,再做后面的处理 这里假设一个 ETL 的场景,输入数据包含两个字段 “type, useri ...

  8. dhtmlxtree动态加载节点数据的小随笔

    最近做了一个这个东西,颇有些感触,随笔记录一下自己的过程. 首先特别感谢:https://blog.csdn.net/cfl20121314/article/details/46852591,对我的帮 ...

  9. Learning Spark中文版--第五章--加载保存数据(2)

    SequenceFiles(序列文件)   SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新 ...

  10. Tree:加载列表数据

    Tree控件,需要提供一个树形的JSON数据,才能正常显示. 通常,开发者在后台可以这样做: 1)从数据库查询出一个列表数据 2)在后台,将列表数据转换为树形数据 3)通过JSON方式返回 在前台页面 ...

随机推荐

  1. 使用kafka作为生产者生产数据到hdfs

    关键:查看kafka官网的userGuide 配置文件: agent.sources = r1agent.sinks = k1agent.channels = c1 ## sources config ...

  2. Linux基本编程环境安装

    前言 可以采用组合式安装,如:https://oneinstack.com/ 选择好要安装的,然后复制安装命令就可以一键搞定很多东西了 VMware安装Centos7 按照物理机CPU实际情况,选择处 ...

  3. ChatGPT学习之旅 (8) 单元测试助手

    大家好,我是Edison. 本篇我们基于上一篇的基础,来写一个单元测试助手的prompt,让它帮我们写一些我们.NET开发者不太愿意编写的单元测试代码,进而提高我们的代码质量,同时还降低我们的开发工作 ...

  4. Mysql与Redis如何保证数据的一致性?

    问题分析: 当MySQL中的数据发生更新时,就面临一个问题,如何确保MySQL与Redis数据的一致性,我们有两个选择: 先更新MySQL,后删除(或更新)Redis 先删除(或更新)Redis,后更 ...

  5. yb课堂之订单列表接口开发 《十七》

    订单列表接口开发 VideoOrderController.java VideoOrderService.java VideoOrderServiceImpl.java VideoOrderMappe ...

  6. [oeasy]python0088_字节_Byte_存储单位_KB_MB_GB_TB

    编码进化 回忆上次内容 上次 回顾了 字符大战的结果 ibm 曾经的 EBCDIC 由于字符不连续的隐患 导致后续 出现 无数问题 无法补救 7-bit 的 ASA X3.4-1963 字母序号连续 ...

  7. [oeasy]python0074_修改字体背景颜色_background_color_背景色

    修改背景色 回忆上次内容 上次将asciiart和颜色一起来玩 7 种基本色 变化多端 不过到目前为止 改的 都是前景色 背景色可以修改吗? 重温参数 具体动手试试 print("\033[ ...

  8. ElementUI FORM结合Vue实现横向排列表单项

    结合Vue实现横向排列表单项 前言 默认的,ElementUI的Form表单项(控件)是垂直排列,即一行显示一个表单项.但是在实际应用中,有时候会需要一行显示多个表单项.针对这类需求,笔者提供以下解决 ...

  9. Django 多数据库配置与使用总结

    Django 多数据库配置与使用总结 By:授客 QQ:103355122 #实践环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: https:/ ...

  10. HCIA first

    每台电脑都有网线 网线连的是什么? 网线插在接入交换机 流量给入汇聚交换机 汇聚给核心交换机 核心交换机 堆叠是指将一台以上的交换机组合起来共同工作,以便在有限的空间内提供尽可能多的端口.多台交换机经 ...