批量插入之分批事務插入
阿新 • • 發佈:2019-02-02
方案:分批事務插入
//DataModel 為自定義的資料模型類,dataList 即傳入的即將要插入的資料集合;
public int insertData(List dataList) throws ClassNotFoundException, SQLException {
//設定每批、每次事務插入多少條資料;
int itemNum = 1000; //開始時間;
Long begin = new Date().getTime();
// 建立sql字首
String prefix = "INSERT INTO tb_ncdc VALUES ";
Connection connection = new DBUtil().getDbCon();
// PrepareStatement類存放每條記錄對應的欄位值;
PreparedStatement preparedStatement= connection.prepareStatement("");
// 建立sql字尾
StringBuffer suffix = new StringBuffer();
// 設定事務為非自動提交
connection.setAutoCommit(false);
//根據總的資料量計算需要分多少次事務插入;
int numTrans = dataList.size() / itemNum + 1 ;
//設定首次事務中的資料在集合中的索引為0;
int numData = 0;
// 外層迴圈,j代表提交事務次序;
for (int j = 1; j <= numTrans; j++) {
// 從索引numData開始查詢總數為itemNum個數據,即為本批要插入的資料量;
for (int i = numData; i < numData + itemNum; i++) {
//判定如果是最後一批,可能會不足itemNum數量,則夠數結束,防止陣列越界;
if (i == dataList.size()) { break; }
// 構建sql字尾
suffix.append("('" + dataList.get(i).getSTN() + "','" + dataList.get(i).getWBAN() + "','" + dataList.get(i).getYEARMODA() + "','" + dataList.get(i).getTEMP() + "','" + dataList.get(i).getDEWP() + "','" + dataList.get(i).getSLP() + "','" + dataList.get(i).getSTP() + "','" + dataList.get(i).getVISIB() + "','" + dataList.get(i).getWDSP() + "','" + dataList.get(i).getMXSPD() + "','" + dataList.get(i).getGUST() + "','" + dataList.get(i).getMAX() + "','" + dataList.get(i).getMIN() + "','" + dataList.get(i).getPRCP() + "','" + dataList.get(i).getSNDP() + "','" + dataList.get(i).getFRSHTT() + "'),");
}
// 構建完整sql
String sql = prefix + suffix.substring(0, suffix.length() - 1);
// 新增sql批;
preparedStatement.addBatch(sql);
// 執行sql批;
preparedStatement.executeBatch();
// 提交本次事務
connection.commit();
// 清空上一次的sql字尾;
suffix = new StringBuffer(); numData += itemNum;
}
// 所有資料庫操作結束後記得關閉連線,減少記憶體的佔用;
preparedStatement.close(); connection.close();
// 結束時間
Long end = new Date().getTime();
// 耗時
System.out.println("插入" + dataList.size() + "條資料的總時間為 : "+ (end - begin) + " ms");
return 1;
}