zoukankan      html  css  js  c++  java
  • 用Java向数据库中插入大量数据时的优化

    注:本文来自http://geeklee.iteye.com/blog/1160949
    • 使用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) {   
       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) {   
       e.printStackTrace();   
      }   
      
    }   
    
    3、使用PreparedStatement + 批处理
    public void exec3(Connection conn){   
      try {   
       conn.setAutoCommit(false);   
       Long beginTime = System.currentTimeMillis();   
       //构造预处理statement  
       PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");   
       //1万次循环  
       for(int i=1;i<=100000;i++){      
        pst.setInt(1, i);   
        pst.addBatch();   
        //每1000次提交一次  
        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) {   
       e.printStackTrace();   
      }   
    }   
    
    结果:
    • 1.使用statement 耗时142秒;
    • 2.使用PreparedStatement 耗时56秒;
    • 3.使用PreparedStatement + 批处理耗时:
      • a.50条插入一次,耗时5秒;
      • b.100条插入一次,耗时2秒;
      • c.1000条以上插入一次,耗时1秒;
    • 通过以上可以得出结论,在使用jdbc大批量插入数据时,明显使用第三种方式(PreparedStatement + 批处理)性能更优。
    结论:
    方法一:普通方式处理大量数据的insert时,处理速度相当慢。  
    */  
    PreparedStatement ps = null;  
    //循环10000次  
    for(int i = 0; i < 100000; i++) {  
        ps = conn.prepareStatement(sql);  
        ps.executeUpdate();  
    }  
    
    方法二:通过addBatch()的方式,将数据缓存在对象里面,通过最后执行executeBatch();方法提交,因此速度会快很多!  
    */  
    PreparedStatement ps = con.prepareStatement(sql);  
    for(int i = 0; i < 100000; i++) {  
        ps.setString(1, "1");  
        ps.setString(2, "2");  
        ps.addBatch();  
    }  
    ps.executeBatch();  
    
  • 相关阅读:
    servlet的细节继续
    Servlet的细节
    【effective c++读书笔记】【第8章】定制new和delete(2)
    【effective c++读书笔记】【第8章】定制new和delete(1)
    【effective c++读书笔记】【第7章】模板和泛型编程(3)
    【effective c++读书笔记】【第7章】模板和泛型编程(2)
    【effective c++读书笔记】【第7章】模板和泛型编程(1)
    【effective c++读书笔记】【第6章】继承与面向对象设计(4)
    【effective c++读书笔记】【第6章】继承与面向对象设计(3)
    【effective c++读书笔记】【第6章】继承与面向对象设计(2)
  • 原文地址:https://www.cnblogs.com/sanjun/p/9968731.html
Copyright © 2011-2022 走看看