JdbcTemplateに基づく一括挿入操作の検討
6895 ワード
MySqlデータベースでは、大量にデータを挿入することがしばしば必要であり、より効率的にデータを挿入するには、ここで3つの方法が議論されている:1.forサイクルを直接利用してinsertを行う.2.JdbcTemplateのbatchUpdateを利用して一括更新を行う.3.mysql接合文を用いて一括更新を行う.テストのコードは以下の通りです:1.forサイクルを直接利用してinsertを行う.
2.JdbcTemplateのbatchUpdateを利用して一括更新を行う.
3.mysql接合文を用いて一括更新を行う.
上記の3つの方法で費やされた時間は,5246,5387,515の順で,単純に挿入操作を実行するだけであれば,接合文の効果で1段階向上した.
@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段階向上した.