之前所有的操作由於數據量很小,所以沒有進行批處理的優化,性能也沒有出現明顯的惡化,但是隨着我用java處理數據量的大幅提高,頻繁使用靜態SQL語句的方法嚴重降低了處理效率,這里總結一下JDBC批處理的方法,來提高數據庫的吞吐量。
首先,在SQL語句的形成上,我們可以使用StringBuilder合成SQL,也可以使用JDBC的set方法將參數帶入。
JDBC的批處理方法已知的有2大類:基於Statement對象的和PreparedStatement對象的
1. Statement對象的批處理
優勢與劣勢:
Statement對象的批處理,通過調用addBatch方法將每個sql單獨加入Batch,調用stmt.executeBatch通常用於處理批量的不同種類SQL語句。本例中給出了使用插入,修改,刪除的批處理示例。
Statement對象發送的是未經過編譯的SQL語句,執行效率較PreparedStatement慢
Connection conn=getConnection(); String sql1 = "insert into multisql (id,name,class) values (3,a great news,see a lot)"; String sql2 = "update multisql set id=3 , name=\'modifiedName\',class=\'mengNew\'"; String sql3 = "delete from multisql where id>0 and name=\'modifiedName\'"; try{ Statement stmt = conn.createStatement(); stmt.addBatch(sql1); stmt.addBatch(sql2); stmt.addBatch(sql3); /** 執行批處理sql */ stmt.executeBatch(); /** 清除已執行的sql */ stmt.clearBatch(); }catch (Exception e){ System.out.println("批量處理SQL出錯!"); e.printStackTrace(); }
2. PreparedStatement對象的批處理
PreparedStatement 類繼承子Statement類,通常我們可以直接用Statement類的引用指向PreparedStatement 類的對象,不過這里對於多態,我還是不很理解,就不bb了。
優勢與劣勢:
PreparedStatement類的批處理方法想數據庫發送的是編譯后的SQL語句,相比於上面調用Statement類的方法,效率有所提高。
PreparedStatement類的批處理方法,用於發送一組同種的SQL操作語句,例如:一組都是insert,或一組都是update、delete,因此常用於批量插入、批量刪除、批量更新字段值等操作。而上面的方法則可發送一組不同操作
由於是一組同種操作,因此常常使用JDBC中自帶的set 方法將字段值等參數 “ 帶入 ” 到SQL語句中
這里就沒有catch語句了,其實焦點都不在catch上。。。
try{ Statement stmt = conn.prepareStatement("insert into multisql (id,name,class) values (?,?,?)"); PreparedStatement ps = conn.prepareStatement("insert into multisql (id,name,class) values (?,?,?)"); ps.setInt(1,par_int); ps.setString(2,"TheName"); ps.setString(3,"phone"); ps.addBatch(); cnt++; if(cnt%1000==0){ ps.executeBatch(); ps.clearBatch();/** 清理SQL指令,避免Out of Memory */ } /** 最終釋放內存 */ ps.close();