1. 程式人生 > >jdbc批量插入幾百萬資料怎麼實現?

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.像這樣的批量插入操作能不使用程式碼操作就不使用,可以使用儲存過程來實現。