今天在作一個將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();