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驅動與數據庫之間的網絡通信