各种jdbc批处理效率比较

花了一天的时间试验了一下各种jdbc批处理,一共测试了4种10万条数据本地mysql插入:
      1.原装jdbc PreparedStatement addBatch();  耗时(7.7秒)
      2.原装jdbc Statement addBatch(sql);  耗时(9.2秒)
      3.原装jdbc Statement execute(sql);  耗时(8秒)
      4.spring jdbcTemplate.batchUpdate(sql,new BatchPreparedStatementSetter() {...}) ;耗时(30分钟以上)
      5.hibernate session.flush()  (很早以前测试的) (10分钟)
    

    程序片段如下:
public void test() {
  StopWatch sw = new StopWatch();
  System.out.println("-----------------start---------------");
  final List list1 = new ArrayList();
  
  sw.start();
  for (int i = 0; i < 2000; i++) {
//   list1.add("douzi");
//   jdbcTemplate.execute();
  }
  Connection con = null;
//  PreparedStatement ps = null;
  Statement st = null;
  try {
   con = jdbcTemplate.getDataSource().getConnection();
   con.setAutoCommit(false);
//   ps = con.prepareStatement("insert into Aa(name) values('douzi')");
   st = con.createStatement();
   for (int i = 0; i < 100000; i++) {
//    ps.setString(1, "douzi" + i);
//    st.addBatch("insert into Aa(name) values('douzi')");
    st.execute("insert into Aa(name) values('douzi')");
//    ps.addBatch();
//    if (i % 10000 == 0) {
////     ps.executeBatch();
////     ps.clearBatch();
//     st.executeBatch();
//     st.clearBatch();
//     con.commit();
//    }
   }
//   ps.executeBatch();
   st.executeBatch();
   st.clearBatch();
   con.commit();
   con.setAutoCommit(true);

  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   try {
//    ps.close();
    st.close();
    con.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  
  
  sw.stop();
  System.out.println("-----------------end---------------" + sw.getTime());
 }

    得出结论为:以后的批处理,就用原始的jdbc批处理即可,其他的框架批处理可以直接忽略掉了,其次前三种jdbc中,我认为使用前两种代码是到哪里都ok的;第三种虽然速度快,但不适用与远程数据库;
    第四种速度慢的根本原因我不清楚,但是知道它是每次都commit一句sql引起的;如何关闭autoCommit,没有实验出来;欢迎知道的告知一下

你可能感兴趣的:(技术贴)