java實現批量匯入資料到資料庫
阿新 • • 發佈:2019-01-10
這裡使用的是jdbc,下面貼出主要的程式碼,connection自己實現就可以了
Connection con = null; try{ con = getConnection(); /* * do update or insert. */ int i = 0; //設定批量處理的數量 int batchSize = 5000; preparedStatement = con.prepareStatement("insert into mysqltest (id,name) " + "values (?,?)"); // 關閉事務自動提交 ,這一行必須加上,否則每插入一條資料會向log插入一條日誌 con.setAutoCommit(false); for (int j = 0; j < 50005; j++){ ++i; preparedStatement.setInt(1, j); preparedStatement.setString(2, "name"); preparedStatement.addBatch(); if ( i % batchSize == 0 || i == batchSize) { preparedStatement.executeBatch(); con.commit(); } } }catch(Exception e){ if(con!=null){ try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } }finally{ if(con!=null){ try { preparedStatement.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } }
注意問題:
可能執行程式碼後資料庫裡沒有更新資料,這個時候就看下有沒有commit,因為如果資料庫引擎是innodb, 不執行commit,資料不會更新;如果用的是myisam引擎,因為不支援事物,不執行commit,也會更新資料。
把資料庫連線con 設定成非自動提交事務,但沒有在執行出現異常的時候進行回滾。如果在執行更改資料表操作的時候出現異常,con既沒有提交也沒有回滾,被操作的表就會被鎖住(如果oracle資料庫就是行鎖),而這個鎖卻沒有機會釋放。有人會質疑,在執行con.close()的時候不會釋放鎖嗎?因為如果應用伺服器使用了資料庫連線池,連線不會被斷開。