MySQL JDBC 批量插入的性能
在一些数据量比较大的项目中,如果每次插入数据库都要进行一次网络请求,那么势必会影响程序的性能。而MySQL的JDBC驱动提供了一个批量插入的方法,可以一次性执行多个SQL语句,显著地提高程序的性能。
阅读更多:MySQL 教程
如何使用批量插入
使用批量插入需要以下步骤:
- 创建PreparedStatement对象。PreparedStatement对象用于执行SQL语句。
PreparedStatement ps = conn.prepareStatement("INSERT INTO user(name,age) VALUES (?,?)");
- 设置参数。使用setXXX方法来为每个参数设置值,其中XXX是参数类型,如setString、setInt等等。
ps.setString(1, "张三");
ps.setInt(2, 20);
- 将PreparedStatement添加进批量处理队列。
ps.addBatch();
- 重复以上步骤多次,最后进行批量处理。
int[] results = ps.executeBatch();
executeBatch()方法返回一个整型数组,表示每条SQL语句执行的结果。如果返回值为-2,则表示该语句执行成功。
如何设置批量处理的大小
默认情况下,JDBC的批量处理大小为1,即一次只执行一条SQL语句。为了提高效率,可以将批量处理的大小设置为一个合理的值。可以通过以下代码实现:
conn.setAutoCommit(false); //关闭自动提交
Statement stmt = conn.createStatement();
stmt.addBatch("INSERT INTO user(name,age) VALUES ('张三',20)");
stmt.addBatch("INSERT INTO user(name,age) VALUES ('李四',22)");
stmt.addBatch("INSERT INTO user(name,age) VALUES ('王五',24)");
int[] results = stmt.executeBatch();
conn.commit(); //提交事务
批量插入的性能测试
下面是使用批量插入和单条插入分别向MySQL数据库插入10000条记录的测试程序,测试环境为:Windows 10、MySQL 8.0.23、MySQL Connector/J 8.0.23、JDK 1.8。测试结果如下:
执行单条插入耗时:78602ms
执行批量插入耗时:1203ms
可以看到,批量插入的速度远远快于单条插入,性能提升显著。
总结
通过使用MySQL的JDBC批量插入功能,可以大大提高程序的性能。同时,需要注意设置批量处理大小,将其设置为一个合理的值,可以进一步提高效率。