JdbcTemplateに基づく一括挿入操作の検討

6895 ワード

MySqlデータベースでは、大量にデータを挿入することがしばしば必要であり、より効率的にデータを挿入するには、ここで3つの方法が議論されている:1.forサイクルを直接利用してinsertを行う.2.JdbcTemplateのbatchUpdateを利用して一括更新を行う.3.mysql接合文を用いて一括更新を行う.テストのコードは以下の通りです:1.forサイクルを直接利用してinsertを行う.
@Rollback(false)
 @Test
 public void testInsert(){
  Long beginTime = System.currentTimeMillis();
  String app_id = "1";
  String[] domainIdArr = new String[cnt];
  for(int i=1;i<=cnt;i++){
   domainIdArr[i-1] = Objects.toString(i);
  }
  String sql ="delete from tbl_route where app_id = ?";
     jdbcTemplate.update(sql, new Object[]{app_id});
     //1、  appId       
     String sql2 = "insert into tbl_route (app_id, domain_id, create_time) values (?,?,?)";
     for(int i=0;i<domainIdArr.length;i++){
      String domain_id = domainIdArr[i];
      Long create_time = new Date().getTime();
      jdbcTemplate.update(sql2, new Object[]{Integer.parseInt(app_id), Integer.parseInt(domain_id), create_time});
     }
     Long endTime = System.currentTimeMillis();
     Long spendTime = endTime-beginTime;
     System.out.println("    :"+spendTime);
 }

2.JdbcTemplateのbatchUpdateを利用して一括更新を行う.
  @Rollback(false)
 @Test
 public void testBatchUpdate(){
  Long beginTime = System.currentTimeMillis();
  String app_id = "1";
  String[] domainIdArr = new String[cnt];
  for(int i=1;i<=cnt;i++){
   domainIdArr[i-1] = Objects.toString(i);
  }
  String sql ="delete from tbl_route where app_id = ?";
     jdbcTemplate.update(sql, new Object[]{app_id});
  String sql2 = "insert into tbl_route (app_id, domain_id, create_time) values (?,?,?)";
  List<Object[]> batchArgs = new ArrayList<Object[]>();
  for(int i=0;i<domainIdArr.length;i++){
   String domain_id = domainIdArr[i];
      Long create_time = new Date().getTime();
      batchArgs.add(new Object[]{Integer.parseInt(app_id), Integer.parseInt(domain_id), create_time});
  }
  jdbcTemplate.batchUpdate(sql2, batchArgs);
  Long endTime = System.currentTimeMillis();
     Long spendTime = endTime-beginTime;
     System.out.println("    :"+spendTime);
 }

3.mysql接合文を用いて一括更新を行う.
 @Rollback(false)
 @Test
 public void testThirdUpdate(){
  Long beginTime = System.currentTimeMillis();
  String app_id = "1";
  String[] domainIdArr = new String[cnt];
  for(int i=1;i<=cnt;i++){
   domainIdArr[i-1] = Objects.toString(i);
  }
  String sql ="delete from tbl_route where app_id = ?";
     jdbcTemplate.update(sql, new Object[]{app_id});
  String sql2 = "insert into tbl_route (app_id, domain_id, create_time) values ";
  List<Object[]> batchArgs = new ArrayList<Object[]>();
  StringBuffer sqlBuffer = new StringBuffer();
  for(int i=0;i<domainIdArr.length;i++){
   String domain_id = domainIdArr[i];
      Long create_time = new Date().getTime();
      if(i != domainIdArr.length-1){
          sqlBuffer.append("(").append(app_id).append(",").append(domain_id).append(",").append(create_time).append(")").append(",");
      }else{
       sqlBuffer.append("(").append(app_id).append(",").append(domain_id).append(",").append(create_time).append(")");
      }
  }
  String sql3 = sql2.concat(sqlBuffer.toString());
  jdbcTemplate.execute(sql3);
  Long endTime = System.currentTimeMillis();
     Long spendTime = endTime-beginTime;
     System.out.println("    :"+spendTime);
 }

上記の3つの方法で費やされた時間は,5246,5387,515の順で,単純に挿入操作を実行するだけであれば,接合文の効果で1段階向上した.