文章目录

  • 1. 版本说明及依赖
  • 2. 普通查询
    • 2.1 优点
    • 2.2 缺点
    • 2.2 代码示例
  • 3. 流式查询
    • 2.1 优点
    • 2.2 缺点
    • 2.2 代码示例
  • 4. 游标查询
    • 2.1 优点
    • 2.2 缺点
    • 2.2 代码示例

1. 版本说明及依赖

  • Jdk版本: jdk1.8.0_121

  • 引入maven依赖

    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version>
    </dependency>
    
  • 初始化数据库数据

    -- 创建数据库
    CREATE DATABASE db_test1;-- 使用数据库
    use db_test1;-- 创建表
    create TABLE `c_m_area` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`area_code` char(20) NOT NULL COMMENT '地区代码',`area_name` varchar(50) NOT NULL COMMENT '地区名称',PRIMARY KEY (`id`)
    ) COMMENT='省市地编码表';-- 初始化数据示例(可以多造些数据,用于测试查询OOM)
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('100000', '总部');
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('110000', '北京市');
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('110101', '东城区');
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('110102', '西城区');
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('120000', '天津市');
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('120100', '市辖区');
    INSERT INTO `c_m_area` (`area_code`, `area_name`) VALUES ('120101', '和平区');
    

2. 普通查询

2.1 优点

应用代码简单,数据量较小时操作速度快。

2.2 缺点

数据量大时会出现OOM问题。

JVM测试参数:

-Xms2m -Xmx2m -XX:-UseGCOverheadLimit

2.2 代码示例

try {Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e){e.printStackTrace();
}String url="jdbc:mysql://localhost:3306/db_test1?useUnicode=true&characterEncoding=utf-8";
try(Connection connection=DriverManager.getConnection(url, "root", "root");PreparedStatement statement=connection.prepareStatement("select id, area_code, area_name from c_m_area");ResultSet rs=statement.executeQuery();) {StringBuffer sb=null;while (rs.next()){sb=new StringBuffer("");sb.append(rs.getString("id")).append("_").append(rs.getString("area_code")).append("_").append(rs.getString("area_name"));System.out.println(sb.toString());}
}catch (Exception e){e.printStackTrace();
}

3. 流式查询

2.1 优点

大数据量时不会有OOM问题。

2.2 缺点

占用数据库时间更长,导致网络拥塞的可能性较大。

JVM测试参数:

-Xms2m -Xmx2m -XX:-UseGCOverheadLimit

2.2 代码示例

try {Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e){e.printStackTrace();
}
Connection connection=null;
PreparedStatement statement=null;
ResultSet rs=null;
String url="jdbc:mysql://localhost:3306/db_test1?useUnicode=true&characterEncoding=utf-8";
try {connection= DriverManager.getConnection(url, "root", "root");statement=connection.prepareStatement("select id, area_code, area_name from c_m_area");//设置为流式查询(每次next都取一条数据)statement.setFetchSize(Integer.MIN_VALUE);rs=statement.executeQuery();StringBuffer sb=null;while (rs.next()){sb=new StringBuffer("");sb.append(rs.getString("id")).append("_").append(rs.getString("area_code")).append("_").append(rs.getString("area_name"));System.out.println(sb.toString());}
}catch (Exception e){e.printStackTrace();
}finally {if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

4. 游标查询

2.1 优点

大数据量时不会有OOM问题,相比流式查询对数据库单次占用时间较短。

2.2 缺点

相比流式查询,对服务端资源消耗更大,响应时间更长。

  • 应用指定每次查询获取的条数fetchSize,MySQL服务器每次只查询指定条数的数据,因此单次查询相比与前面两种方式占用MySQL时间较短。
  • 但由于MySQL方不知道客户端什么时候将数据消费完,MySQL需要建立一个临时空间来存放每次查询出的数据。
  • 大数据量时MySQL服务器IOPS、磁盘占用都会飙升,而且需要与服务器进行更多次的网络通讯,因此最终查询效率是不如流式查询的

jvm测试参数:

-Xms2m -Xmx2m -XX:-UseGCOverheadLimit

2.2 代码示例

try {Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e){e.printStackTrace();
}Connection connection=null;
PreparedStatement statement=null;
ResultSet rs=null;
//(1)数据库连接汇总指定游标查询:useCursorFetch=true
String url="jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=utf-8&useCursorFetch=true";
try {connection= DriverManager.getConnection(url, "root", "root");statement=connection.prepareStatement("select id, area_code, area_name from c_m_area");//(2)设置每次取数批次statement.setFetchSize(1);rs=statement.executeQuery();StringBuffer sb=null;while (rs.next()){sb=new StringBuffer("");sb.append(rs.getString("id")).append("_").append(rs.getString("area_code")).append("_").append(rs.getString("area_name"));System.out.println(sb.toString());}
}catch (Exception e){e.printStackTrace();
}finally {if(rs!=null){try {rs.close();} catch (SQLException e) { e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

Jdbc普通查询、流式查询、游标查询相关推荐

  1. jdbc mysql 返回游标_使用JdbcTemplate流式(游标)读取数据库

    前言 生产环境中经常使用数据库分页的方式来控制一次获取的数据量,而数据处理中经常会有另外一种场景: 从一个数据库表中读取所有数据进行处理并将结果保存在其他数据库或文件或NoSql数据库中. 这时候也可 ...

  2. mysql 流式查询_Mybatis流式查询避免OOM

    前言 当指定查询数据过大时,我们一般使用分页查询的方式,一页一页的将数据放到内存处理.但有些情况不需要分页的方式查询数据,如果一下子将数据全部加载出来到内存中,很可能会发生OOM.这时我们可以使用流式 ...

  3. Flink流式计算从入门到实战 四

    文章目录 六.Flink Table API 和Flink SQL 1.Table API和SQL是什么? 2.如何使用Table API 3.基础编程框架 3.1 创建TableEnvironmen ...

  4. 大数据量查询:流式查询与游标查询

    最近在做一个计算相关的功能,大体就是有很多条SQL,每条SQL都涉及复杂地运算,最后要将所有计算结果进行合并分析.经初步测试,每个SQL起码会查出几十万条记录,我们现在有毛毛多的这种SQL. 最大的问 ...

  5. MyBatis中使用流式查询避免数据量过大导致OOM

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap s ...

  6. java 数据库 流式查询_关于mybatis:强大MyBatis-三种流式查询方法

    基本概念 流式查问指的是查问胜利后不是返回一个汇合而是返回一个迭代器,利用每次从迭代器取一条查问后果.流式查问的益处是可能升高内存应用. [腾讯云]云产品限时秒杀,爆款1核2G云服务器,首年99元 如 ...

  7. 还在用分页?你out了 !试试 MyBatis 流式查询,真心强大!

    欢迎关注方志朋的博客,回复"666"获面试宝典 基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使 ...

  8. 还在用分页?太Low !试试 MyBatis 流式查询,真心强大!

    以下文章来源方志朋的博客,回复"666"获面试宝典 基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内 ...

  9. 强大:MyBatis 流式查询

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! ‍基本概念 流式查询指的是查询成功后不是返回一个集合而是返 ...

最新文章

  1. BCH大涨带领币市小幅走高 个别币种走势逐步分化
  2. websocket小荔枝
  3. 如何从RxJava升级到RxJava2
  4. vue的父子组建之间的通信(-),基于props和$emit之间的传递
  5. boost::filesystem模块打印文件的大小的测试程序
  6. matlab simulnk笔记07——模块(接地模块group、终止模块terminal、信号合并mux与分解模块demux)
  7. mysql 批量建表_mysql 如何实现循环批量插入?
  8. CCRD_TOC_2008年第4期
  9. 最短路问题——spfa算法
  10. 总结:linux运维常用命令
  11. mysql batch insert_使用batch insert解决MySQL的insert吞吐量问题
  12. 美国MAK Technoligies介绍
  13. 又发现个新的全网资源搜索神器
  14. 1小时赚300块,不打代码帮人做个吃鸡网页 [IVX实战第3篇]
  15. Git - 版本穿梭(时光穿梭机)
  16. 【u-boot】uboot代码简要分析 (u-boot 移植)
  17. latex中文支持问题,自动化学报latex模板问题
  18. 简单随机选人网站设计
  19. 从零开始学习Linux运维,成为IT领域翘楚(三)
  20. 手把手教你搭建一个属于自己的Ghost博客

热门文章

  1. Linux虚拟化:KVM影子页表
  2. 如何创建一个最小的串口、TTY设备包括虚拟控制台,串口以及伪终端设备的驱动程序
  3. Linux驱动开发快速参考
  4. OpenGL简介+一个简单的程序
  5. python time库_python--time库的使用
  6. flask数据库sqlalchemy查询
  7. python基础安装第三方(十三)
  8. python基础整数和浮点数(一)
  9. java垃圾回收GC(学习笔记)
  10. 安装activemq