写点什么

JDBC-- 批量插入

用户头像
打工人!
关注
发布于: 2021 年 03 月 23 日
JDBC--批量插入

前言

对于插入操作,如果我们插入一条数据就写一个 sql 语句,那么这将是一个很大的工程,因此批量插入操作就上线了,PreparedStatement 相比 Statement 的一个很大的优势就是可以实现插入操作。因此这里我们使用 PreparedStatement 类。由于 update 和 delete 本身就是批量操作的功能,比如可以一次删除所有字段信息,因此这里我们只对批量插入操作进行讨论。

实现方法一

@Test    public void testInsert1() {        Connection conn = null;        PreparedStatement ps = null;        try {            long start = System.currentTimeMillis();            conn = JDBC_Utils.getConnection();            String sql= "insert into goods(name) values(?)";            ps = conn.prepareStatement(sql);						          	// 此for循环即是批量操作            for (int i = 1; i <= 20000 ; i++) {                ps.setObject(1, "name_"+ i);                ps.execute();
} long end = System.currentTimeMillis(); System.out.println("花费时间:"+ (end-start)); } catch (Exception e) { e.printStackTrace(); } finally { JDBC_Utils.closeResource(conn,ps); } }
复制代码

实现方法二(对方法一改进)

  1. 使用 addBatch(), executeBatch(), clearBatch()

  2. mysql 服务器默认是关闭批处理的,我们需要通过一个参数,让 mysql 开 启批处理的支持。

  3. ?rewriteBatchedStatements=true 写在配置文件的 url 后面。如下 url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

  4. 使用更新的 mysql 驱动(最低为这个版本):mysql—connector-java-5.1.37-bin.jar

@Test    public void testInsert2() {        Connection conn = null;        PreparedStatement ps = null;        try {            long start = System.currentTimeMillis();            conn = JDBC_Utils.getConnection();            String sql= "insert into goods(name) values(?)";            ps = conn.prepareStatement(sql);
for (int i = 1; i <= 20000 ; i++) { ps.setObject(1, "name_"+ i); // 1.攒sql ps.addBatch(); if (i % 500 == 0){ // 2.执行 ps.executeBatch(); // 3.清空batch ps.clearBatch(); }
} long end = System.currentTimeMillis(); System.out.println("花费时间:"+ (end-start)); } catch (Exception e) { e.printStackTrace(); } finally { JDBC_Utils.closeResource(conn,ps); } }
复制代码

实现方法三(对方法二优化)

我们还可以对方法二进行优化,以缩短操作时间。就是我们可以执行 sql 语句,但是暂时不提交到数据库,等批处理完毕后,在进行提交。次方法也是推荐使用的方法。

 @Test    public void testInsert3() {
Connection conn = null;
PreparedStatement ps = null; try { long start = System.currentTimeMillis(); conn = JDBC_Utils.getConnection();
// 可以优化的空间: // 执行的时候,先不提交,先把数据缓存起来 conn.setAutoCommit(false);
String sql= "insert into goods(name) values(?)"; ps = conn.prepareStatement(sql);
for (int i = 1; i <= 20000 ; i++) { ps.setObject(1, "name_"+ i); // 1.攒sql ps.addBatch(); if (i % 500 == 0){ // 2.执行 ps.executeBatch(); // 3.清空batch ps.clearBatch(); }
} // 执行完数据之后,再提交 conn.commit();
long end = System.currentTimeMillis(); System.out.println("花费时间:"+ (end-start)); } catch (Exception e) { e.printStackTrace(); } finally { JDBC_Utils.closeResource(conn,ps); } }
复制代码


发布于: 2021 年 03 月 23 日阅读数: 13
用户头像

打工人!

关注

还未添加个人签名 2019.11.10 加入

嗨,欢迎来到我的简介部分!本人打工人一枚,自动化和控制专业入坑人一枚。目前在研究深度强化学习(DRL)技术,菜狗一枚。准备入坑互联网小白一枚。喜欢了解科技前沿技术,喜欢拍照。同时也是A股的韭菜一枚。

评论

发布
暂无评论
JDBC--批量插入