美文网首页
Jdbc普通查询、流式查询、游标查询

Jdbc普通查询、流式查询、游标查询

作者: 水煮鱼又失败了 | 来源:发表于2020-05-19 12:52 被阅读0次

目录

[TOC]

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普通查询、流式查询、游标查询

      本文链接:https://www.haomeiwen.com/subject/lejvohtx.html