JDBC学习(八):PreparedStatement实现数据的批量插入

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: JDBC学习(八):PreparedStatement实现数据的批量插入

方法一:耗时最长(我的电脑比较老,插两万条大概耗时一分多钟)


package demo04;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.jupiter.api.Test;
import utils.JDBCUtils;
/**
 * 使用prepaerdStatement实现批量插入
 * @author pc
 *
 */
public class InsertTest {
  @Test
  public void test(){
    Connection conn = null;
    PreparedStatement ps = null;
    try {
      long start = System.currentTimeMillis();
      conn = JDBCUtils.getConnection();
      String sql = "insert into admin (username)values(?)";
      ps = conn.prepareStatement(sql);
      for (int i = 0; i <= 20000; i++) {
        ps.setObject(1, "name_"+i);
        ps.execute();
      }
      long end = System.currentTimeMillis();
      System.out.println("花费时间为:"+(end-start)); //花费时间为:908010
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.closeResourse(conn, ps);
    }
  }
}


改进一:设置参数让mysql开启对批处理的支持(耗时3s多,效率明显提升)


package demo04;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.jupiter.api.Test;
import utils.JDBCUtils;
/**
 * 使用prepaerdStatement实现批量插入
 * @author pc
 *
 */
public class InsertTest { 
  /**
   * mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
   *     ?rewriteBatchedStatements=true 写在配置文件的url后面
   *    使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar
   */
  @Test
  public void test2(){
    Connection conn = null;
    PreparedStatement ps = null;
    try {
      long start = System.currentTimeMillis();
      conn = JDBCUtils.getConnection();
      String sql = "insert into admin (username)values(?)";
      ps = conn.prepareStatement(sql);
      for (int i = 0; i <= 20000; i++) {
        ps.setObject(1, "name_"+i);
        //1. “攒batch”
        ps.addBatch();
        //2. 执行
        if(i % 500 == 0) {
          ps.executeBatch();
        }
        //3. 清空batch
        ps.clearBatch();
      }
      long end = System.currentTimeMillis();
      System.out.println("花费时间为:"+(end-start)); //花费时间为:3060
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.closeResourse(conn, ps);
    }
  }
}


改进二:不允许自动提交数据,等数据积攒到一定量了之后一次提交


package demo04;
import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.jupiter.api.Test;
import utils.JDBCUtils;
/**
 * 使用prepaerdStatement实现批量插入
 * @author pc
 *
 */
public class InsertTest {
  @Test
  public void testFinal(){
    Connection conn = null;
    PreparedStatement ps = null;
    try {
      long start = System.currentTimeMillis();
      conn = JDBCUtils.getConnection();   
      //设置不允许自动提交数据
      conn.setAutoCommit(false);
      String sql = "insert into admin (username)values(?)";
      ps = conn.prepareStatement(sql);
      for (int i = 0; i <= 20000; i++) {
        ps.setObject(1, "name_"+i);
        //1. “攒batch”
        ps.addBatch();
        //2. 执行
        if(i % 500 == 0) {
          ps.executeBatch();
        }
        //3. 清空batch
        ps.clearBatch();
      }
      //统一提交数据
      conn.commit();
      long end = System.currentTimeMillis();
      System.out.println("花费时间为:"+(end-start)); //花费时间为:898
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.closeResourse(conn, ps);
    }
  }
}


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
Java 数据库连接 数据库
【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101 cannot allocate 0 bytes for anlHeapMalloc异常
【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101 cannot allocate 0 bytes for anlHeapMalloc异常
|
3月前
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
本文以GIS表为例,介绍通过Java代码向数据库插入POINT类型地理数据的方法。首先创建包含ID和POS字段的GIS表,POS字段为ST_GEOMETRY类型。接着利用Java的PreparedStatement批量插入10条经纬度相同的POINT数据,最后查询结果显示成功插入10条记录,验证了操作的正确性。
84 19
|
3月前
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
|
4月前
|
Java 数据库连接 数据库
【YashanDB 知识库】jdbc 查询 st_geometry 类型的数据时抛出 YAS-00101 cannot allocate 0 bytes for anlHeapMalloc 异常
**简介:** 客户在使用 YashanDB JDBC 驱动查询含 st_geometry 列的数据时,遇到 YAS-00101 错误,提示无法分配内存。该问题影响所有版本的 YashanDB,导致业务中断。原因是用户缺少对 st_geometry 类型的 execute 权限。解决方法是为用户赋权:`grant execute any type to &lt;username&gt;;` 以恢复正常运行。
|
3月前
|
Java 数据库连接 定位技术
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
|
3月前
|
SQL Java 数据库连接
【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
由于网络带宽不足导致的jdbc向yashandb插入数据慢
|
4月前
|
Java 数据库连接 数据库
【YashanDB 知识库】jdbc 查询 st_geometry 类型的数据时抛出 YAS-00101 cannot allocate 0 bytes for anlHeapMalloc 异常
**问题简介:** 客户使用 YashanDB JDBC 驱动查询含 st_geometry 列的数据时,出现 YAS-00101 错误,提示无法分配 0 字节内存。该问题影响所有 YashanDB 版本,导致业务中断。原因是数据库用户缺少 st_geometry 类型的 execute 权限。解决方法是为用户赋权:`grant execute any type to &lt;username&gt;;`。
|
8月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
231 0
|
8月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
105 0
|
8月前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
1639 1