JDBC批量插入案例

声明:本人使用的是公司2核4GB服务器进行的测试,插入速度受服务器限制

第一种方式: 批处理禁用自动提交功能

    String jdbcUrl = "jdbc:sqlserver://121.37.155.***:46943;databaseName=ruoyi;useUnicode=true&characterEncoding=utf-8";
    String dbUser = "ic_gas_read_****";
    String dbPassword = "ic_gas_read_*****";
    @Test
    public void bulkSubmissionTest1() throws SQLException {
        long start = System.currentTimeMillis();//开始计时【单位:毫秒】
        Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPassword);//获取数据库连接
        String sql = "insert into cba (id, name) VALUES (?,null)";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            conn.setAutoCommit(false);//取消自动提交
            for (int i = 1; i <= 100000; i++) {
                ps.setString(1, String.valueOf(i));//填充sql语句种得占位符
                ps.addBatch();
            }
            ps.executeBatch();
            ps.clearBatch();
            conn.commit();//所有语句都执行完毕后才手动提交sql语句
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            ps.close();
            conn.close();
        }
        //打印耗时【单位:毫秒】
        System.out.println("十万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
    }

十万条数据用时 2.9秒

在这里插入图片描述

第二种方式: 使用批处理

    String jdbcUrl = "jdbc:sqlserver://121.37.155.***:46943;databaseName=ruoyi;useUnicode=true&characterEncoding=utf-8";
    String dbUser = "ic_gas_read_****";
    String dbPassword = "ic_gas_read_****";
    
    @Test
    public void bulkSubmissionTest1() throws SQLException {
        long start = System.currentTimeMillis();//开始计时【单位:毫秒】
        Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPassword);//获取数据库连接
        String sql = "insert into cba (id, name) VALUES (?,null)";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 1; i <= 100000; i++) {
                ps.setString(1, String.valueOf(i));//填充sql语句种得占位符
                ps.addBatch();
                if (i%500==0){
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            ps.close();
            conn.close();
        }
        //打印耗时【单位:毫秒】
        System.out.println("百万条数据插入用时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
    }

十万条数据用时 69秒

在这里插入图片描述

二者间的区别

  • 这两段代码的主要区别在于它们处理事务的方式。第一种代码示例在执行批量插入操作之前禁用了自动提交功能,并在执行完所有操作后显式地提交了事务。这意味着在执行批量插入操作期间,所有更改都将在事务范围内进行。这种方法可以确保数据的一致性和完整性,尤其是在处理多个操作时。
  • 第二种代码示例没有显式地处理事务。它将每500个插入操作分为一个批次,并在每个批次后执行 executeBatch()。这种方法可能会导致在执行过程中,部分插入操作已经提交,而其他操作尚未提交。这可能会导致数据的不一致性和不完整性,尤其是在处理大量操作时。
  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放逐N_K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值