java-Statement、PreparedStatement、PreparedStatement + 批處理 的區別
為了區分 “Statement、PreparedStatement、PreparedStatement + 批處理” 這三者之間的效率,下面的示例執行過程都是在資料庫表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){//可以設定不同的大小;如50,100,500,1000等等
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Statement和PreparedStatement之間的區別
- JDBC之Statement,PreparedStatement,CallableStatement的區別JDBC
- JDBC使用PreparedStatement的好處JDBC
- 使用預處理PreparedStatement執行Sql語句SQL
- java preparedStatementJava
- MySQL PreparedStatementMySql
- JDBC教程之PreparedStatementJDBC
- Java中Statement與PreparedStatement與CallableStatement之間的區別 - javarevisitedJava
- 教程:使用PreparedStatement訪問DLA
- 使用PreparedStatement實現CRUD操作
- JDBC3——SQL隱碼攻擊、及其解決方法——Statement與PreparedStatement對比——PreparedStatement的CRUDJDBCSQL
- MySQL-07——JDBC、Properties、DBCP、PreparedstatementMySqlJDBC
- 使用PreparedStatement為佔位符?賦值賦值
- JDBC中PreparedStatement介面的執行邏輯JDBC
- JDBC PreparedStatement 實現原理【推薦閱讀】JDBC
- 20160408javaweb之JDBC ---PreparedStatementJavaWebJDBC
- 使用PreparedStatement向資料表中插入、修改、刪除、獲取Blob型別的資料型別
- Windows批處理學習(二)——批處理(3)薦Windows
- 批處理框架框架
- JDBC 批處理JDBC
- 碎片批處理
- 批處理命令
- 批處理概述
- Apache Beam,批處理和流式處理的融合!Apache
- windows批處理之一:字串處理Windows字串
- Windows批處理命令Windows
- 批處理命令大全
- 批處理壓縮
- 批處理----學習
- DOS 批處理命令
- java當中的批處理Java
- JDBC當中的批處理JDBC
- 批處理中的符號符號
- 批處理中的for詳解
- CPU(中央處理器)和GPU(影像處理器)的區別GPU
- preparedstatement用insert時候後面自動補空格,如何解決?
- 如何快速的插入 100W資料到資料庫,使用PreparedStatement 最快實現!資料庫
- 批處理打補丁的方法