读书人

(转) jdbc批量安插

发布时间: 2012-12-19 14:13:14 作者: rapoo

(转) 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 + 批处理)性能更优。 

读书人网 >其他数据库

热点推荐