JDBC大批量插入数据性能优化
nura4704
9年前
来自: http://my.oschina.net/u/2246523/blog/608131
把最终测试效率最高的方式记录一下,在mysql5.6下下面这种方式比batchUpdate的方式要快N倍
:
package com.jdbc.batch; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BufferQuery { private static Connection mysqlConn = null; private static ResultSet rs = null; // 总条数 private static int allCount = 10000; // 分批条数 private static int preCount = 1000; // 计数器 private static int count = 0; private static String insertSQL = "insert into users(firstname, lastname, age) values(?, ?, ?)"; private static PreparedStatement mysqlPs = null; public static void main(String[] args) throws SQLException { try { StringBuilder sb = new StringBuilder(); sb.append("insert into users(firstname, lastname, age) values"); mysqlConn = DBUtils.getMySqlConn(); mysqlPs = mysqlConn.prepareStatement(insertSQL); mysqlConn.setAutoCommit(false); long start = System.currentTimeMillis(); for (int i = 1; i <= allCount; i++) { if(i > 1) sb.append(","); sb.append("('aa"+ i +"','bb',23)"); if(i % preCount == 0){ System.out.println("导入进行===>" + (++count * preCount) + "条"); } } mysqlPs.executeUpdate(sb.toString()); long end = System.currentTimeMillis(); System.out.println("数据导入完毕,所用时间为: " + (end - start) + " ms"); } catch (Exception e) { mysqlConn.rollback(); System.out.println("数据出错,已进行回滚"); throw new RuntimeException(); } finally { mysqlConn.commit(); DBUtils.free(rs, mysqlPs, mysqlConn); } } }