用JDBC操作MySQL——大量數據庫操作時使用批處理提速


之前所有的操作由於數據量很小,所以沒有進行批處理的優化,性能也沒有出現明顯的惡化,但是隨着我用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();

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM