jdbc批量插入實現大批量數據快速插入

    今天在作一個將excel數據導入數據庫的程序時,因爲數據量大,準備採用jdbc的批量插入。因而用了preparedStatement.addBatch();當加入1w條數據時,再執行插入操做,preparedStatement.executeBatch()。我原覺得這樣會很快,結果插入65536條數據一共花30多分鐘,徹底出乎個人意料。因而問了一下同事,他們在處理這種大批量數據導入的時候是如何處理的,發現他們也是用的jdbc批量插入處理,但與我不一樣是:他們使用了con.setAutoCommit(false);而後再preparedStatement.executeBatch()以後,再執行con.commit();因而再試,什麼叫奇蹟?就是剛剛導入這些數據花了半小時,而加了這兩句話以後,如今只用了15秒鐘就完成了。因而去查查了緣由,在網上發現了以下一段說明:java

    * When importing data into InnoDB, make sure that MySQL does not have autocommit mode enabled because thatsql

      requires a log flush to disk for every insert. To disable autocommit during your import operation, surround it with數據庫

      SET autocommit and COMMIT statements:ui

      SET autocommit=0;
     ... SQL import statements ...
     COMMIT;spa

    第一次,正是由於沒有setAutoCommit(false);那麼對於每一條insert語句,都會產生一條log寫入磁盤,因此雖然設置了批量插入,但其效果就像單條插入同樣,致使插入速度十分緩慢。excel

    部分代碼以下:
code

String sql = "insert into table *****";
con.setAutoCommit(false);
ps = con.prepareStatement(sql);
for(int i=1; i<65536; i++){
    ps.addBatch();
    // 1w條記錄插入一次
    if (i % 10000 == 0){
         ps.executeBatch();
         con.commit();
     }
}
// 最後插入不足1w條的數據
ps.executeBatch();
con.commit();
相關文章
相關標籤/搜索