java-Statement、PreparedStatement、PreparedStatement + 批處理 的區別

season0891發表於2009-06-30
轉自 :http://hi.baidu.com/haifengjava/blog/item/544723d7977999d4a144df86.html

為了區分 “StatementPreparedStatementPreparedStatement + 批處理這三者之間的效率,下面的示例執行過程都是在資料庫表t1中插入1萬條記錄,並記錄出所需的時間(此時間與電腦硬體有關)。實驗結果如下:

1.使用Statement物件 用時31

2.預編譯PreparedStatement 用時14

3.使用PreparedStatement + 批處理   用時485毫秒

-------------------------------------------------------

1.使用Statement物件

使用範圍:當執行相似SQL(結構相同,具體值不同)語句的次數比較少

優點:語法簡單

缺點:採用硬編碼效率低,安全性較差

原理:硬編碼,每次執行時相似SQL都會進行編譯   

        

示例執行過程:

   public void exec(Connection conn){

        try {

                Long beginTime = System.currentTimeMillis();

                conn.setAutoCommit(false);//設定手動提交

                Statement st = conn.createStatement();

                for(int i=0;i<10000;i++){

                   String sql="insert into t1(id) values ("+i+")";

                   st.executeUpdate(sql);

                }

                Long endTime = System.currentTimeMillis();

                System.out.println("Statement用時:"+(endTime-beginTime)/1000+"");//計算時間

                st.close();

               conn.close();

        } catch (SQLException e) {             

                  e.printStackTrace();

        }

   }

執行時間:Statement用時:31

----------------------------------------------------------------

2.預編譯PreparedStatement

使用範圍:當執行相似sql語句的次數比較多(例如使用者登陸,對錶頻繁操作..)語句一樣,只是具體的值不一樣,被稱為動態SQL

優點:語句只編譯一次,減少編譯次數。提高了安全性(阻止了SQL注入)

缺點: 執行非相似SQL語句時,速度較慢。

原理:相似SQL只編譯一次,減少編譯次數

事例執行過程:

      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<10000;i++){

                       pst.setInt(1, i);

                       pst.execute();   

                }

                conn.commit();

                Long endTime = System.currentTimeMillis();

                System.out.println("Pst用時:"+(endTime-beginTime)+"");//計算時間

                pst.close();

                conn.close();

         } catch (SQLException e) {               

                  e.printStackTrace();

         }

    }

執行時間:Pst用時:14

------------------------------------------------------------------

3.使用PreparedStatement + 批處理

使用範圍:一次需要更新資料庫表多條記錄

優點:減少和SQL引擎互動的次數,再次提高效率,相似語句只編譯一次,減少編譯次數。提高了安全性(阻止了SQL注入)

缺點:

原理:批處理: 減少和SQL引擎互動的次數,一次傳遞給SQL引擎多條SQL

名詞解釋:

PL/SQL引擎:oracle中執行pl/sql程式碼的引擎,在執行中發現標準的sql會交給sql引擎進行處理。

SQL引擎:執行標準sql的引擎。

事例執行過程:

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<=10000;i++){   

                pst.setInt(1, i);

                pst.addBatch();//加入批處理,進行打包

                if(i%1000==0){//可以設定不同的大小;如501005001000等等

                      pst.executeBatch();

                      conn.commit();

                      pst.clearBatch();

                }//end of if

           }//end of for

           pst.executeBatch();

           Long endTime = System.currentTimeMillis();

           System.out.println("pst+batch用時:"+(endTime-beginTime)+"毫秒");

           pst.close();

           conn.close();

      } catch (SQLException e) {

            e.printStackTrace();

      }

}

執行時間:pst+batch用時:485毫秒

摘自垃圾廣告.com/topic/368990


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-607949/,如需轉載,請註明出處,否則將追究法律責任。

相關文章