方案:分批事务插入
//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;
}
批量插入之分批事务插入
最新推荐文章于 2024-02-05 17:28:08 发布