通过JDBC使用批处理+事务,往数据库中插入百万级数据测试

来源:互联网 发布:python hex to ascii 编辑:程序博客网 时间:2024/06/05 16:25

最近再学习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);}}


原创粉丝点击