

public static void main(String[] args) {
 Connection conn = getConn(lsqlurl, luser, lpassword);
 long startTime = System.currentTimeMillis();
 try {
 PreparedStatement pst = conn.prepareStatement("insert into testmy (id,name,age) values (?,?,?)");
 for (int i = 0; i < 2000; i++) {
 pst.setInt(1, 3);
 pst.setString(2, "xx");
 pst.setInt(3, 10);
 pst.addBatch();
 }
 pst.executeBatch();
 long endTime = System.currentTimeMillis();
 System.out.println((endTime - startTime)/1000+"s");
 System.out.println("test sql batch--->2000.....");
 } catch (SQLException e) {
 e.printStackTrace();
 }finally {
 if(conn!=null) {
 try {
 conn.close();
 } catch (SQLException e) {
 e.printStackTrace();
 }
 }
 }
 }你会发现时间会是30s 左右。
2k行的数据插入就30秒 。
2w行数据插入时间为940秒(约16min)。
2、修改自动提交的 batch
public static void main(String[] args) {
 Connection conn = getConn(lsqlurl, luser, lpassword);
 long startTime = System.nanoTime();
 try {
 conn.setAutoCommit(false);
 PreparedStatement pst = conn.prepareStatement("insert into test (id,name,age) values (?,?,?)");
 for (int i = 0; i < 2000; i++) {
 pst.setInt(1, 3);
 pst.setString(2, "xx");
 pst.setInt(3, 10);
 pst.addBatch();
 }
 pst.executeBatch();
 conn.commit();
 long endTime = System.nanoTime();
 System.out.println((endTime - startTime)/1000000+"ms");
 System.out.println("test sql batch--->2000.....");
 } catch (SQLException e) {
 try {
 conn.rollback();
 } catch (SQLException e1) {
 e1.printStackTrace();
 }
 e.printStackTrace();
 }finally {
 if(conn!=null) {
 try {
 conn.close();
 } catch (SQLException e) {
 e.printStackTrace();
 }
 }
 }
 }2k行插入耗时大概是260ms。
2w行数据插入大概是1.4s。
其实结果很明显的。
因为在使用batch时数据量达到一定的值后数据库会自动提交。而不是你执行executeBatch时再执行。所以我们需要修改自动提交变成手动提交。
这里还有一个问题是:当你实在执行事务时,一旦出错的时候,自动提交会帮你rollback,手动提交时就应该自己进行回退。
所以在catch里需要添加 rollback 。 
好了,综上我们可以使用自动提交的batch进行大量数据的插入。
