1. 程式人生 > >JDBC批處理-大量資料插入資料庫減少插入時間

JDBC批處理-大量資料插入資料庫減少插入時間

Class.forName("oracle.jdbc.driver.OracleDriver");
con =DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "aaaa", "bbbb");
con.setAutoCommit(false);//設定自動提交
String sql = "INSERT INTO exl_shortm_mx (TRANSACTION_DATE,TRANSACTION_ORGCODE,ADD_GYNO,TRANSACTION_ACCOUNTS,CHARGE_TYPE,ORGCODE,TRANSACTION_CODE,GROUP_NUMBER,SERVICE_TYPE,PHONE_NUMBER,LASTTRADING_TIME,ORG_TYPE,CUST_MANAGER_ID,ADMINISTRATION_COD)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; //用作預編譯大量插入資料都是格式化資料
prest = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

int single_num = 0;//用於記錄迴圈到第幾行


int flag = 2000;//用於一次性插入2000條。

InputStreamReader read1 = new InputStreamReader(in, encoding);// 考慮到編碼格式
BufferedReader bufferedReader1 = new BufferedReader(read);//這個read就是從外部檔案獲取的檔案流
while ((lineTxt1 = bufferedReader1.readLine()) != null) {
if (single_num >=1){ //這邊的判斷是為了跳過第一行,第一行一般為標題
if (flag != 0) {
singleString = lineTxt1.split("\\|");
prest.setString(1, singleString[0].trim());
prest.setString(2, singleString[1].trim());
prest.setString(3, singleString[2].trim());
prest.setString(4, singleString[3].trim());
prest.setString(5, singleString[4].trim());
prest.setString(6, singleString[5].trim());
prest.setString(7, singleString[6].trim());
prest.setString(8, singleString[7].trim());
prest.setString(9, singleString[8].trim());
prest.setString(10, singleString[9].trim());
prest.setString(11, singleString[10].trim());
prest.setString(12, singleString[11].trim());
prest.setString(13, singleString[12].trim());
prest.setString(14, singleString[13].trim());
prest.addBatch();

flag --;//不等於0的情況下 就把資料全部插入進去使用 addBath()
}else {

//當讀取第2000個的時候也就是flag ==0 時,執行prest.executeBatch();
singleString = lineTxt1.split("\\|");
prest.setString(1, singleString[0].trim());
prest.setString(2, singleString[1].trim());
prest.setString(3, singleString[2].trim());
prest.setString(4, singleString[3].trim());
prest.setString(5, singleString[4].trim());
prest.setString(6, singleString[5].trim());
prest.setString(7, singleString[6].trim());
prest.setString(8, singleString[7].trim());
prest.setString(9, singleString[8].trim());
prest.setString(10, singleString[9].trim());
prest.setString(11, singleString[10].trim());
prest.setString(12, singleString[11].trim());
prest.setString(13, singleString[12].trim());
prest.setString(14, singleString[13].trim());
prest.addBatch();
prest.executeBatch();

prest.clearBatch(); //最後將Batch清理掉
flag = 2000;//重新賦值2000
}
}
single_num++;//用於記錄迴圈到第幾行
}
prest.executeBatch(); //執行批處理
successnum++; //成功檔案數

con.commit();
read.close();
in.close();
con.close();
prest.close();

說明: 用完的輸入流,資料庫連線,預編譯都進行關閉。 single_num用來控制迴圈,當迴圈到第二條的時候,再進行插入,因為第一行是一個說明頭。每次迴圈將需要插入的資料 addBatch插入到prest中,當最後全部addBatch後,執行executeBatch,將所有資料全部提交到資料中。由於資料庫一直保持開啟狀態,所以插入速度是非常快速的。