mysql流式查询 vs 翻页_如何正确使用 MySQL 的流式查询

本文探讨了在大数据量查询时,MySQL的流式查询相对于分页的优势,以防止一次性加载数据导致的内存溢出。通过示例展示了如何使用JDBC、MyBatis的CursorItemReader和ResultHandler实现流式查询,并解释了客户端流式查询与服务器端流式查询的区别。
摘要由CSDN通过智能技术生成

一、前言

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

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

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

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

如何使用 JDBC 编程方式在 MySQL 中使用流式查询?

如何在 Mybatis 中使用 MyBatisCursorItemReader 进行流式查询?

如何在 Mybatis 中使用 ResultHandler 进行流式查询?

什么是客户端流式查询和服务器端流式查询?

二、使用 MySQL 进行数据查询时候发生了什么

首先我们来看看在不用流式查询时候当我们发一个数据库查询到底发生了什么?普通查询下一般是下面结构:

public void selectData(String sqlCmd, ProcessCallback callBack) throws SQLException {

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null;

try {

conn = dataSource.getConnection();

stmt = conn.prepareStatement(sqlCmd);

rs = stmt.executeQuery();

// 执行回调

callBack.doAction(rs);

} finally {

close(stmt, rs, conn);

}

}

public static void main(String[] args) throws Exception {

DataSourceService dataSourceService = new DataSourceService();

dataSourceService.init(url, userName, pwd);

//dataSourceService.initData(692396,100000);

dataSourceService.selectData("select * from device", new ProcessCallback() {

public void doAction(ResultSet rs) {

try {

while(rs.next()) {

System.out.println(rs.getString("device_id"));

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

f0a8e66124958f78c149437d72bdb18b.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值