JDBC批量增加数据
对于数据库的操作,之前我的博客有通用的增删改查操作,除此之外,许多数据库都要求批量操作.
不过对于删改查操作来说,之前介绍的方法就自带批量的意思.主要这次来分享一下批量增加.
一般对于批量操作,我们还是会想到用PreparedStatement来进行操作.
第一种方法:
long start = System.currentTimeMillis();
Connection conn = JDBCUtils.getConnection();
String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 1;i <= 20000;i++){
ps.setString(1, "name_" + i);
ps.executeUpdate();
}
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
JDBCUtils.closeResource(conn, ps);
这种方法虽然直白简单,但速度稍微慢了些,采用一些方法将他改进.和I/O流中的read()和read(byte[])的速度改进一样.
修改1: 使用 addBatch() / executeBatch() / clearBatch()
修改2:mysql服务器默认是关闭批处理的,我们需要通过一个参数,
让mysql开启批处理的支持。 ?rewriteBatchedStatements=true 写在配置文件的url后面
修改3:使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar
public void testInsert1() throws Exception{
long start = System.currentTimeMillis();
Connection conn = JDBCUtils.getConnection();
String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 1;i <= 1000000;i++){
ps.setString(1, "name_" + i); //1.“攒”sql ps.addBatch();
if(i % 500 == 0){
//2.执行
ps.executeBatch();
//3.清空
ps.clearBatch();
}
}
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
//20000条:625
//1000000条:14733
JDBCUtils.closeResource(conn, ps);
}
由于数据在存储时是采用一条条的存的方式,所以速度仍然有进步的空间,所以我们采用让数据一次存入的方法可以大大提升速度:
下面展示一些 内联代码片
。
最终版
层次四:在方法二的基础上操作
使用Connection 的 setAutoCommit(false) / commit()
public void testInsert2() throws Exception{
long start = System.currentTimeMillis();
Connection conn = JDBCUtils.getConnection();
//1.设置为不自动提交数据
conn.setAutoCommit(false);
String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 1;i <= 1000000;i++){
ps.setString(1, "name_" + i);
//1.“攒”sql
ps.addBatch();
if(i % 500 == 0){
//2.执行
ps.executeBatch();
//3.清空
ps.clearBatch();
}
}
//2.提交数据
conn.commit();
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
//1000000条:4978
JDBCUtils.closeResource(conn, ps);
}