MySQL数据库流式查询的使用

本文探讨了MySQL数据库流式查询的用途,旨在防止大量数据查询导致的内存溢出(OOM)。通过对比JDBC和Spring Data JPA中流式查询与普通查询的耗时和内存使用,展示了流式查询的优势:耗时少且内存占用稳定。文中提供了具体代码示例和内存监控工具VisualVM的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL数据库流式查询的使用

1. 背景
MySQL使用流式查询的目的,简单来说,就是避免查询数据量过大导致OOM。
详情可参考:https://www.jianshu.com/p/eedc9350f700
本文主要介绍流式查询在JDBC、JPA中的使用方法。

2. 使用

2.1 JDBC中的使用

部分主要代码片段如下:

	@Test
    public void testQuery() {
        long startTime = System.currentTimeMillis();

        //查询并处理逻辑
        String sql = "select * from ordersummary limit 300000";
        execute(sql, false);

        long endTime = System.currentTimeMillis();
        System.out.println("总记录条数为:" + count);
        System.out.println("消耗时间为:" + (endTime - startTime));
    }

    private void execute(String sql, boolean isStreamQuery) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            //获取数据库连接
            conn = getConnection();
            if (isStreamQuery) {
                //设置流式查询参数
                stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                stmt.setFetchSize(Integer.MIN_VALUE);
            } else {
                //普通查询
                stmt = conn.prepareStatement(sql);
            }

            //执行查询获取结果
            rs = stmt.executeQuery();
            //遍历结果
            while(rs.next()){
                System.out.println(
                        rs.getString(1) + "=" + rs.getString(2) + "="
                        + rs.getString(3) + "=" + rs.getString(4) + "="
                        + rs.getString(5) + "=" + rs.getString(6) + "="
                        + rs.getString(7) + "=" + rs.getString(8) + "="
                        + rs.getString(9) + "=" + rs.getString(10)
                );
                count++;
            }
        } catch (SQLException e) {
            //handle exception
        } finally {
            close(stmt, rs, conn);
        }
    }

查询30W条数据并打印,普通查询与流式查询耗时情况与内存变化图如下:

  • 普通查询
    普通查询耗时结果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值