PreparedStatement和Statement區別

選擇PreparedStatement還是Statement取決於你要怎麼使用它們。對於只執行一次的SQL語句選擇Statement是最好的. 相反, 如果SQL語句被多次執行選用PreparedStatement是最好的。

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

  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++) {

    ps.setString(name[n]);    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(); 


perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement 對象實例

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

發佈了21 篇原創文章 · 獲贊 28 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章