最近再学习MySQL,有时候需要百万级/千万级的数据量来支撑测试,刚开始通过语句一条一条的插入,200W行插入了4个小时才搞定,所以写了如下代码来快速插入。
单纯的JDBC,没有采用多线程,多线程的方式后期会更新,代码有缺陷的地方,希望评论指出。
JdbcUtils就不贴出来了。
本人自用笔记本,插入速度大概在 1W+条 / S
public void commitBatch() {
String Thread = "InnoDB";
//事务数量
int number = 1;
//事务上限
int maxCommit = 50000;
//插入数量
int insertNumber = 500000;
System.out.println("当前数据引擎:"+Thread+",测试:通过JDBC使用批处理+事务,往数据库中插入"+(insertNumber/10000)+"W条数据,现在时间:"+new Date());
Connection conn = null;
PreparedStatement pstmt = null;
Long startTime = System.currentTimeMillis();
try {
// 获取连接
conn = JdbcUtils.getConnection();
// 获得发送sql 的对象
String sql = "insert into tuser(name,password,userid) values(?,?,?)";
pstmt = conn.prepareStatement(sql);
//设置事务不自动提交
conn.setAutoCommit(false);
// 批量插入记录
for (int i = 1; i <= insertNumber; i++) {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
// 设置参数
pstmt.setString(1, "name" + i);
pstmt.setString(2, uuid);
pstmt.setInt(3, i);
// 增加到批处理中
pstmt.addBatch();
//分段提交
if(i%maxCommit==0&& i!=0){
number++;
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(false);// 开始事务
pstmt = conn.prepareStatement(sql);
}
}
// 执行
pstmt.executeBatch();
//提交事务
conn.commit();
Long endTime = System.currentTimeMillis();
System.out.println("当前数据引擎:"+Thread+",已成功插入"+(insertNumber/10000)+"W条数据,现在时间:"+new Date());
System.out.println("当前数据引擎:"+Thread+",用时:" + ((endTime - startTime))+"毫秒");
System.out.println("当前数据引擎:"+Thread+",每"+(maxCommit/10000)+"W为一个事务,共使用了:"+number+"个事务。");
System.out.println("当前数据引擎:"+Thread+",本次JDBC批处理事务上限测试是:"+maxCommit);
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, pstmt);
}
}