PreparedStatement和Statement區別

 JDBC驅動的最佳化是基於使用的是什麼功能. 
選擇PreparedStatement仍是Statement取決於你要怎麼使用它們。對於只執行一次的SQL語句選擇Statement是最好的. 相反, 若是SQL語句被屢次執行選用PreparedStatement是最好的。web

    PreparedStatement: 數據庫會對sql語句進行預編譯,下次執行相同的sql語句時,數據庫端不會再進行預編譯了,而直接用數據庫的緩衝區,提升數據訪問的效率(但儘可能採用使用?號的方式傳遞參數),若是sql語句只執行一次,之後再也不復用。    從安全性上來看,PreparedStatement是經過?來傳遞參數的,避免了拼sql而出現sql注入的問題,因此安全性較好。在開發中,推薦使用 PreparedStatement。sql

  PreparedStatement的第一次執行消耗是很高的。它的性能體如今後面的重複執行。例如, 假設我使用Employee ID, 使用prepared的方式來執行一個針對Employee表的查詢。JDBC驅動會發送一個網絡請求到數據解析和優化這個查詢,而執行時會產生另外一個網絡請求。在JDBC驅動中,減小網絡通信是最終的目的。若是個人程序在運行期間只須要一次請求, 那麼就使用Statement. 對於Statement, 同一個查詢只會產生一次網絡到數據庫的通信。數據庫

  對於使用PreparedStatement池的狀況下, 本指導原則有點複雜。當使用PreparedStatement池時, 若是一個查詢很特殊, 而且不太會再次執行到, 那麼可使用Statement。若是一個查詢不多會被執行,但鏈接池中的Statement池可能被再次執行, 那麼請使用PreparedStatement。在不是Statement池的一樣狀況下, 請使用Statement。安全

  使用PreparedStatement的Batch功能網絡

  Update大量的數據時, 先Prepare一個INSERT語句再屢次的執行, 會致使不少次的網絡鏈接。要減小JDBC的調用次數改善性能, 你可使用PreparedStatement的AddBatch()方法一次性發送多個查詢給數據庫. 例如, 讓咱們來比較一下下面的例子。性能

  例 1: 屢次執行Prepared Statement  PreparedStatement ps = conn.prepareStatement(    "INSERT into employees values (?, ?, ?)");優化

    for (n = 0; n < 100; n++) {spa

    ps.setString(name[n]);   orm

    ps.setLong(id[n]);   開發

    ps.setInt(salary[n]);    

    ps.executeUpdate();

   } 

  例 2: 使用Batch

PreparedStatement ps = conn.prepareStatement(    "INSERT into employees values (?, ?, ?)");

    for (n = 0; n < 100; n++) {

        ps.setString(name[n]);    

        ps.setLong(id[n]);    

        ps.setInt(salary[n]);    

         ps.addBatch();

     }

        ps.executeBatch(); 

  在例 1中, PreparedStatement被用來屢次執行INSERT語句。在這裏, 執行了100次INSERT操做,共有101次網絡往返。其中,1次往返是預儲statement, 另外100次往返執行每一個迭代。在例2中,當在100次INSERT操做中使用addBatch()方法時, 只有兩次網絡往返。1次往返是預儲statement,另外一次是執行batch命令。雖然Batch命令會用到更多的數據庫的CPU週期, 可是經過減小網絡往返,性能獲得提升。記住,JDBC的性能最大的增進是減小JDBC驅動與數據庫之間的網絡通信

相關文章
相關標籤/搜索