关于批量插入数据

测试数据库为mysql!!!

方法一:

public static void insert () {
         // 开时时间
         Long begin = new Date ().getTime();
         // sql前缀
         String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES " ;
         try {
             // 保存sql后缀
             StringBuffer suffix = new StringBuffer();
             // 设置事务为非自动提交
             conn.setAutoCommit( false );
             // Statement st = conn.createStatement();
             // 比起st,pst会更好些
             PreparedStatement pst = conn.prepareStatement( "" );
             // 外层循环,总提交事务次数
             for ( int i = 1; i <= 100; i++) {
                 // 第次提交步长
                 for ( int j = 1; j <= 10000; j++) {
                     // 构建sql后缀
                     suffix.append( "(" + j * i + ", SYSDATE(), " + i * j
                             * Math.random() + ")," );
                 }
                 // 构建完整sql
                 String sql = prefix + suffix. substring (0, suffix.length() - 1);
                 // 添加执行sql
                 pst.addBatch(sql);
                 // 执行操作
                 pst.executeBatch();
                 // 提交事务
                 conn. commit ();
                 // 清空上一次添加的数据
                 suffix = new StringBuffer();
             }
             // 头等连接
             pst. close ();
             conn. close ();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         // 结束时间
         Long end = new Date ().getTime();
         // 耗时
         System. out .println( "cast : " + ( end - begin ) / 1000 + " ms" );
方法二:     }

输出时间:cast : 23 ms

该方法目前测试是效率最高的方法!

 

方法二:

 

public static void insertRelease() {
         Long begin = new Date ().getTime();
         String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)" ;
         try {
             conn.setAutoCommit( false );
             PreparedStatement pst = conn.prepareStatement(sql);
             for ( int i = 1; i <= 100; i++) {
                 for ( int k = 1; k <= 10000; k++) {
                     pst.setLong(1, k * i);
                     pst.setLong(2, k * i);
                     pst.addBatch();
                 }
                 pst.executeBatch();
                 conn. commit ();
             }
             pst. close ();
             conn. close ();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         Long end = new Date ().getTime();
         System. out .println( "cast : " + ( end - begin ) / 1000 + " ms" );
     }

 

控制台输出:cast : 111 ms

执行时间是上面方法的5倍!

 

方法三:

public static void insertBigData(SpringBatchHandler sbh) {
         Long begin = new Date ().getTime();
         JdbcTemplate jdbcTemplate = sbh.getJdbcTemplate();
         final int count = 10000;
         String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)" ;
         jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
             // 为prepared statement设置参数。这个方法将在整个过程中被调用的次数
             public void setValues(PreparedStatement pst, int i)
                     throws SQLException {
                 pst.setLong(1, i);
                 pst.setInt(2, i);
             }
 
             // 返回更新的结果集条数
             public int getBatchSize() {
                 return count ;
             }
         });
         Long end = new Date ().getTime();
         System. out .println( "cast : " + ( end - begin ) / 1000 + " ms" );
     }

 

该方法采用的是spring batchUpdate执行,因效率问题,数据量只有1万条!

执行时间:cast : 387 ms

 

 

总结:方法一和方法二很类同,唯一不同的是方法一采用的是“insert into tb (...) values(...),(...)...;”的方式执行插入操作,

方法二则是“insert into tb (...) values (...);insert into tb (...) values (...);...”的方式,要不是测试,我也不知道两者差别是如此之大!

当然,这个只是目前的测试,具体执行时间和步长也有很大关系!如过把步长改为100,可能方法就要几分钟了吧,这个可以自己测试哈。。。

方法三网上很推崇,不过,效率大家也都看到了,1万条记录,耗时6分钟,可见其效率并不理想!而且方法三需要配置spring applicationContext环境才能应用!

不过,方法三在ssh/spring-mvc中可用性还是很高的!

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值