首页 > 数据库 >使用JDBC查询数据库会一次性加载所有数据吗

使用JDBC查询数据库会一次性加载所有数据吗

时间:2024-03-17 16:44:06浏览次数:28  
标签: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,一次性,数据库,设置,查询数据库,客户端,数据,加载
From: https://www.cnblogs.com/Nuwa/p/18078758

相关文章

  • Unity3D 基础 05 场景加载
    Unity3D基础系列(第五期)场景配置首先,在资源文件夹里创建一个LoadScene场景,摆放一些物体,用来做初始场景。然后创建一个Stage文件夹,并创建两个场景Stage1、Stage2。两个Stage场景也可以简单布置一下,方便区分。接着,打开BuildSettings,把需要加载的场景添加到配置......
  • AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!
        在.NET的无限宇宙中,动态加载dll似乎一直是操控代码生生不息的魔杖。今天,我将与您探讨如何通过AntSK0.2.1版本灵活运用dll,将FunctionCall的强大功能插拔自如地融入项目之中,我们走入插件化开发的全新篇章。新版本简介       AntSK,这个曾被我们广泛探讨过的......
  • JVM 实战 - JVM之类加载过程
    在Java虚拟机(JVM)中,类加载过程是将编译后的.class文件或其它格式的类定义数据加载到JVM内存的方法区,并为这些类型创建运行时的Class对象实例的过程。这个过程确保了Java代码能够在JVM上被正确执行。类加载主要包括以下几个步骤:加载(Loading)通过类的全限定名来查找和读取对......
  • 【Web】浅聊Hessian反序列化之Resin的打法——远程类加载
    目录前言原理分析XString:触发恶意类toStringQName的设计理念?远程恶意类加载Context:ContinuationContextQName:恶意toString利用hash相等构造EXP前言精神状态有点糟糕,随便学一下吧首先明确一个朴素的认知:当Hessian反序列化Map类型的对象的时候,会自动调用其put方法,而......
  • Jemter查询数据库
    1、导入mysql驱动在mysql官网下载mysql驱动https://www.mysql.com/;参考博客,https://blog.csdn.net/Li_Ya_Fei/article/details/104583417,将下载下来的jar包存放在apache-jmeter-5.3\lib\ext下后重启jemter。2、创建JDBCConnectionConfiguration  3、创建JDBCrequest......
  • AVCE - AV Evasion Craft Online 更新 8 种加载方式 - 过 WD 等
    免责声明:本工具仅供安全研究和教学目的使用,用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任,且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规,并理解并同意本声明的所有内容。下载地址https://github.com/yu......
  • 【JS】Promise.all实现所有接口加载完成loading关闭
    将每个请求封装成promise对象,当请求到数据后都resolve出去,再调用Promsie.all方法将每个promise对象作为参数传入进去。这样每个api的promise对象状态都resolve“解决后”,就能在Promise.all([p1,p2…p]).then中拿到所有api请求完成的状态,从而实现效果。created(){t......
  • JDBC的执行流程!!!
    JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。原始的JDBC操作数据库主要有以下几个步骤:1.注册驱动使用Class.forName()方法加载数据库驱动......
  • pnpm : 无法加载文件 D:\dev\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。有关详
    一、问题现象  二、问题原因  1、此问题是由于PowerShell的执行策略限制了脚本的执行//通过命令可以查看当前策略Get-ExecutionPolicy     2、策略说明:Restricted:默认策略,禁止运行任何脚本,除非明确允许。AllSigned:只允许运行经由数字签名并由受信......
  • Spring Boot 2.x中配置文件加载顺序分析
    一般springboot2.x的配置有多种方式,如resources文件夹中可以定义bootstrap.yml(或bootstrap.properties)、application.yml(或application.properties)、配置中心(如nacos),那么它们加载顺序是怎样的,如何使用?bootstrap.yml:首先加载bootstrap.yml(或bootstrap.properties)。这个......