目录
[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();}
}
}