批量插入之分批事务插入

来源:互联网 发布:java 效率最高的排序 编辑:程序博客网 时间:2024/05/24 02:07
方案:分批事务插入//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;  }
原创粉丝点击