jdbc批量插入幾百萬資料怎麼實現?
網上搜到這樣的一篇部落格,我覺得講的不錯,分享給大家:
今天在做一個將excel資料匯入資料庫的程式時,由於資料量大,準備採用jdbc的批量插入。於是用了preparedStatement.addBatch();當加入1w條資料時,再執行插入操作,preparedStatement.executeBatch()。我原以為這樣會很快,結果插入65536條資料一共花30多分鐘,完全出乎我的意料。於是問了一下同事,他們在處理這種大批量資料匯入的時候是如何處理的,發現他們也是用的jdbc批量插入處理,但與我不同是:他們使用了con.setAutoCommit(false);然後再preparedStatement.executeBatch()之後,再執行con.commit();於是再試,什麼叫奇蹟?就是剛剛匯入這些資料花了半小時,而加了這兩句話之後,現在只用了15秒鐘就完成了。於是去查查了原因,在網上發現瞭如下一段說明:
* When importing data into InnoDB, make sure that MySQL does not have autocommit mode enabled because that
requires a log flush to disk for every insert. To disable autocommit during your import operation, surround it with
SET autocommit and COMMIT statements:
SET autocommit=0;
... SQL import statements ...
COMMIT;
第一次,正是因為沒有setAutoCommit(false);那麼對於每一條insert語句,都會產生一條log寫入磁碟,所以雖然設定了批量插入,但其效果就像單條插入一樣,導致插入速度十分緩慢。
部分程式碼如下:
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();
概括為幾點:
1.變多次提交為一次
2.使用批量操作
3.像這樣的批量插入操作能不使用程式碼操作就不使用,可以使用儲存過程來實現。