springboot 的 jdbcTemplate 是springboot对jdbc的简单封装。
本文主要内容是jdbcTemplate批量操作。
批量插入,批量更新等操作,调用的都是jdbcTemplate.batchUpdate()方法
打开idea,看batchUpdate()有以下几种重载方法:
本文主要说下第一种int[] batchUpdate(String... sql)和第五种 int[] batchUpdate(String sql, List batchArgs)的性能差异。
本文利用Spring boot的StopWatch来统计代码运行耗费的时间。
不了解的可以看看下面文章参考下:
建表sql
CREATE TABLE `test_jdbc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
测试代码
StopWatch stopWatch = new StopWatch();
//多条sql执行 即 int[] batchUpdate(String... sql)
String[] strings = new String[10000];
for (int i = 0; i < 10000; i++) {
strings[i] = "insert into test_jdbc (`name`) values ('"+i+"')";
}
stopWatch.start("多条sql");
jdbcTemplate.batchUpdate(strings);
stopWatch.stop();
//一条sql,多组参数 即 int[] batchUpdate(String sql, List<Object[]> batchArgs)
String sql = "insert into test_jdbc (`name`) values (?)";
ArrayList<Object[]> objectList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Object[] objects = new Object[]{String.valueOf(i)};
objectList.add(objects);
}
stopWatch.start("一条sql,多组参数");
jdbcTemplate.batchUpdate(sql, objectList);
stopWatch.stop();
//打印结果
System.out.println(stopWatch.prettyPrint());
运行结果
StopWatch '': running time = 15360877100 ns
---------------------------------------------
ns % Task name
---------------------------------------------
15193000600 099% 多条sql
167876500 001% 一条sql,多组参数
单位是纳秒,换算到秒,一个是15.19s,一个是0.16s,相差还是非常巨大的。
还有一个要注意的地方是jdbc的配置
同样的代码,将rewriteBatchedStatements=true修改为rewriteBatchedStatements=false之后,结果如下
StopWatch '': running time = 35699665400 ns
---------------------------------------------
ns % Task name
---------------------------------------------
20115727800 056% 多条sql
15583937600 044% 一条sql,多组参数
一条sql,多组参数的时间变成15.58s,比之前开启了rewriteBatchedStatements的多条sql时间还要长。