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();