日期:2014-05-16  浏览次数:20449 次

JDBC批量插入测试
2009-05-21 
使用JDBC插入大量数据的性能测试  
关键字: 性能测试  
 
使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:  
 
//1.使用statement插入100000条记录  
 
   
 
public void exec(Connection conn){  
 
  try {  
 
   Long beginTime = System.currentTimeMillis();  
 
   conn.setAutoCommit(false);//设置手动提交  
 
   Statement st = conn.createStatement();  
 
   for(int i=0;i<100000;i++){  
 
    String sql="insert into t1(id) values ("+i+")";  
 
    st.executeUpdate(sql);    
 
   }  
 
   Long endTime = System.currentTimeMillis();  
 
   System.out.println("st:"+(endTime-beginTime)/1000+"秒");//计算时间  
 
   st.close();  
 
   conn.close();  
 
  } catch (SQLException e) {  
 
   // TODO Auto-generated catch block  
 
   e.printStackTrace();  
 
  }    
 
 }  
 
//2.使用PreparedStatement对象  
 
public void exec2(Connection conn){  
 
  try {  
 
   Long beginTime = System.currentTimeMillis();  
 
   conn.setAutoCommit(false);//手动提交  
 
   PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");  
 
   for(int i=0;i<100000;i++){  
 
    pst.setInt(1, i);  
 
    pst.execute();      
 
   }  
 
   conn.commit();  
 
   Long endTime = System.currentTimeMillis();  
 
   System.out.println("pst:"+(endTime-beginTime)/1000+"秒");//计算时间  
 
   pst.close();  
 
   conn.close();  
 
  } catch (SQLException e) {  
 
   // TODO Auto-generated catch block  
 
   e.printStackTrace();  
 
  }  
 
 }  
 
//3.使用PreparedStatement + 批处理  
 
public void exec3(Connection conn){  
 
  try {  
 
   conn.setAutoCommit(false);  
 
   Long beginTime = System.currentTimeMillis();  
 
   PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");  
 
     
 
   for(int i=1;i<=100000;i++){      
 
    pst.setInt(1, i);  
 
    pst.addBatch();  
 
    if(i%1000==0){//可以设置不同的大小;如50,100,500,1000等等  
 
     pst.executeBatch();  
 
     conn.commit();  
 
     pst.clearBatch();  
 
    }  
 
   }  
 
   Long endTime = System.currentTimeMillis();  
 
   System.out.println("pst+batch:"+(endTime-beginTime)/1000+"秒");  
 
   pst.close();  
 
   conn.close();  
 
  } catch (SQLException e) {  
 
   // TODO Auto-generated catch block  
 
   e.printStackTrace();  
 
  }  
 
 }  
 
在Oracle 10g中测试,结果:  
 
1.使用statement耗时142秒;  
 
2.使用PreparedStatement耗时56秒;  
 
3.使用PreparedStatement + 批处理耗时:  
 
a.50条插入一次,耗时5秒;  
 
b.100条插入一次,耗时2秒;  
 
c.1000条以上插入一次,耗时1秒;  
 
通过以上可以得出结论,在使用jdbc大批量插入数据时,明显使用第三种方式(PreparedStatement + 批处理)性能更优。
?