首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL中流式查询使用

MySQL中流式查询使用

作者头像
加多
修改于 2025-07-23 08:27:57
修改于 2025-07-23 08:27:57
1.7K00
代码可运行
举报
文章被收录于专栏:Java编程技术Java编程技术
运行总次数:0
代码可运行

一、前言

MySQL 是目前使用比较广泛的关系型数据库,而从数据库里面根据条件查询数据到内存的情况想必大家在日常项目实践中都有使用。

当指定条件的数据量特别大时候一般是通过分页的方式在前端页面通过 Tag 标签一页页的加载数据到内存;但是有些情况下却不需要用户切换 Tag 标签的方式一页页的加载数据,这时候如果一下子全部把数据加载内存,就有可能会导致 OOM,虽然这时候可以通过程序控制分页查询,但是每次查询时候数据库都需要把所有符合条件的数据查询出来然后根据当前页的返回来返回指定的页,这无疑加重了 MySQL 服务器不必要的开销。

其实在 MySQL 中提供了流式查询,这允许把符合条件的数据一部分一部分的加载到内存,本 Chat 就来具体讲解如何在 MySQL中使用流式查询:

  • 使用流式查询前,我们是如何在 MySQL 中进行查询数据的,整个过程发生了什么?
  • 如何使用 JDBC 编程方式在 MySQL 中使用流式查询?

二、普通查询

image.png

  • 当我们在JVM进程里面的某一个线程里面执行数据库查询时候,其实这个请求首先会调用mysql驱动程序。
  • mysql驱动接受到请求后会向MySQL服务器发起TCP请求,服务器端根据条件查询出匹配的数据,然后通过TCP链接发送到MySQL驱动
  • MySQL驱动内则会把符合条件的数据缓存到驱动内,等服务器返回了所有符合条件的数据后,在一下子把缓存里面的数据返回给调用sql的应用程序。

所以如果查询的数据量特别大,那么mysql驱动内缓存就可能把内存撑爆造成OOM。

三、JDBC编程中MySQL流式查询

mysql客户端流式查询不会一下子把服务器端所有数据缓存起来,而是一部分一部分的把服务器端返回的数据返回给应用程序层,所以可以有效避免OOM。

JDBC编程中MYSQL流式查询例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void selectData(String sqlCmd,) throws SQLException {

    validate(sqlCmd);

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    try {

        conn = petadataSource.getConnection();
        
        stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            stmt.setFetchSize(Integer.MIN_VALUE);
            
        rs = stmt.executeQuery();

        try {
            while(rs.next()){
                try {
                    System.out.println("one:" + rs.getString(1) + "two:" + rs.getString(2) + "thrid:" + rs.getString(3));
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        } finally {
            close(stmt, rs, conn);

        }
}

可知只是prepareStatement时候改变了参数为ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,并且设置了PreparedStatement的fetchsize为Integer.MIN_VALUE。

四、最后

上面我们讲解了JDBC中流式查询使用,那么如下在Mybatis中使用那?

  • 如何在 Mybatis 中使用 MyBatisCursorItemReader 进行流式查询?
  • 如何在 Mybatis 中使用 ResultHandler 进行流式查询?
  • 什么是客户端流式查询和服务器端流式查询?
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.08.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mysql中使用流式查询避免数据量过大导致OOM
java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM。
加多
2018/09/06
1.6K0
Mysql中使用流式查询避免数据量过大导致OOM
大数据量查询容易OOM?试试MySQL流式查询
程序访问 MySQL 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。
陶陶技术笔记
2021/01/12
2.5K0
大数据量查询容易OOM?试试MySQL流式查询
Jdbc知识点全整理,你值得拥有 ​(1)
Jdbc JDBC入门 1 什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。 2 JDBC原理 早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访
Java帮帮
2018/03/19
1.3K0
Jdbc知识点全整理,你值得拥有 ​(1)
面试官:从 MySQL 数据库里读取 500w 数据行进行处理,应该怎么做更效益化?
由于现在 ORM 框架的成熟运用,很多小伙伴对于 JDBC 的概念有些薄弱,ORM 框架底层其实是通过 JDBC 操作的 DB
Java程序猿
2021/05/19
2.4K0
Mysql中使用流式查询避免数据量过大导致OOM-后续
之前http://www.jianshu.com/p/0339c6fe8b61 介绍了MySQL中三种使用流式方法,看起来很优雅,实则优雅的同时还是有一些注意事项的,下面就针对流式查询时候的注意事项进行介绍。
加多
2018/09/06
4.7K0
java底层代码jdbc,sql 部分,随堂笔记1
//1.PreparedStatement pstmt //2.PreparedStatement pstmt = con.prepareStatement(sql) //插入sql语句的方法,使用的是connection(con)中的prepareStatment方法 //3.ResultSet rs = pstmt.executeQuery() //获取使用sql语句后查询到的结果集,用rs接收 ,使用的是PreparStatement(pstmt)中的executQuery方法 //4.pstmt
用户8483969
2021/04/09
3370
Java豆瓣电影爬虫——减少与数据库交互实现批量插入
  节前一个误操作把mysql中record表和movie表都清空了,显然我是没有做什么mysql备份的。所以,索性我把所有的表数据都清空的,一夜回到解放前……   项目地址:https://github.com/DMinerJackie/JewelCrawler   在上一个版本中,record表存储了7万多条记录,爬取的有4万多条,但是可以明显的发现爬取的数据量越多的时候,机子就越卡。又一次报错,是有关JDBC的,还有一次机子跑卡死了。   仔细一琢磨,上个版本的爬虫程序与数据库的读写次数太频繁,存在以
JackieZheng
2018/01/16
1.2K0
Java豆瓣电影爬虫——减少与数据库交互实现批量插入
java:JDBC详解
JDBC全称为:Java DataBase Connectivity(java数据库连接)。
intsmaze-刘洋
2018/08/29
9770
MyBatis中使用流式查询避免数据量过大导致OOM
其中fetchSize="-2147483648",Integer.MIN_VALUE=-2147483648
加多
2018/09/06
8.3K0
MyBatis中使用流式查询避免数据量过大导致OOM
彻底搞懂JDBC的运行过程
前几天笔者发布了博客手写mybatis彻底搞懂框架原理。为了帮助初学者更好理解mybatis框架,这次讲解一下Java的JDBC的运行过程。
全菜工程师小辉
2019/08/16
2.2K0
JDBC的CRUD操作之查询数据操作
JDBC的CRUD操作之查询数据操作 1.1.1 查询操作的代码实现 已知表数据: package com.xdr630.jdbc.demo1; import java.sql.Connecti
兮动人
2021/06/11
3930
JDBC的CRUD操作之查询数据操作
JavaWeb(四)JDBC操作Oracle
JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。 jdbc是一套标准,它是由一些接口与类组成的。 涉及到的类与接口:   java.sql     类:DriverManger     接口 Connection Statement ResultSet PreparedStatement     CallableStatement(它是用于调
二十三年蝉
2018/02/28
1.5K0
JavaWeb(四)JDBC操作Oracle
JDBC工具类的抽取
因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成。
兮动人
2021/06/11
3800
JDBC工具类的抽取
解锁高效:深入MySQL JDBC流式结果集
有粉丝好友问sharding-jdbc对分库分表的逻辑表数据分页排序是如何高效实现的?答案就是分表查询+流式归并。本文直接从MySQL JDBC的流式结果集来说明流式处理,时间宝贵,case如下:
码农小麦
2024/07/20
4820
解锁高效:深入MySQL JDBC流式结果集
浅析JDBC的ResultSet接口和使用MySQL语句查询数据
在《浅析JDBC常用的接口——JDBC的Statement接口、PreparedStatement接口》文章中,我们介绍了使用Java语言来执行SQL语句。本文主要给大家介绍在Java语言中,通过执行SQL语句后,如何使用ResultSet接口来获取表中的数据、使用MySQL语句查询表中的数据,接下来小编带大家一起来学习!
Java进阶者
2021/07/01
2K0
Java JDBC 连接 MySQL8 数据库
MySQL 8.0 以上版本的数据库连接有所不同: 1、MySQL 8.0 以上版本驱动包版本 mysql-connector-java-8.0.16.jar。 2、com.mysql.jdbc.Driver 更换为 com.mysql.cj.jdbc.Driver。 MySQL 8.0 以上版本不需要建立 SSL 连接的,需要显示关闭。 allowPublicKeyRetrieval=true 允许客户端从服务器获取公钥。 最后还需要设置 CST。 加载驱动与连接数据库方式如下: Class.forNam
FHAdmin
2021/05/23
4.6K0
JavaWeb后端入门1-JDBC(Eclipse环境)
mysql驱动包为mysql-connector-java-5.1.7-bin.jar
用户6948990
2025/04/03
1470
JavaWeb后端入门1-JDBC(Eclipse环境)
JDBC技术(前篇)
Java database connectivity,java连接数据库,其实就是通过java语言里按揭数据库。 原来在操作数据库是在控制台写sql语句来操作数据库,jdbc就是通过向数据库发送 sql语句操作数据库。 JDBC原理: 比如 买完电脑,装上显卡,还需要安装显卡的驱动,那么显卡驱动程序包是 显卡的厂商提供。 JDBC操作数据库:mysql、oracle、DB2等数据库,前提是导入数据库驱动的程序包。 那么这些数据库驱动的程序包是谁提供的?数据库厂商提供。 程序员通过操作JDBC这一组接口就可以操作不同的数据库了。
别团等shy哥发育
2023/02/27
3830
JDBC技术(前篇)
day06_JDBC学习笔记
  JDBC:Java DataBase Connectivity,是SUN公司提供的一套操作数据库的标准规范(技术)。
黑泽君
2018/10/11
7000
day06_JDBC学习笔记
Java Review(三十四、JDBC)
JDBC指Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。
三分恶
2020/07/16
8460
相关推荐
Mysql中使用流式查询避免数据量过大导致OOM
更多 >
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术工作实战群
获取实战干货 交流技术经验
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档