为了提高大数据量的插入数据,对将要存入的list集合进行切割 此处的dulTpList 为百万级别的数据对象集合
// 数据传输,为提高插入效率,对数据进行切割 int size = 1000; if (dulTpList.size() <= size) { // 若数据量小于size时,直接插入 insertDulDataForSqlServer(con, dulTpList); } else { int times = (int) Math.ceil(dulTpList.size() / size); System.out.println("总插入批次 times: " + times); for (int i = 0; i <= times; i++) { System.out.println("截取的开始角标"+i * size +" 截止角标" + Math.min((i + 1) * size, dulTpList.size()) + " min"+(i + 1) * size+" max"+dulTpList.size()); // Math.min()方法,取较小值 subList = dulTpList.subList(i * size, Math.min((i + 1) * size, dulTpList.size())); // 插入 insertDulDataForSqlServer(con, subList); } }
切割源数据就保证了每次插入的数据为0-1000,1000-2000,2000-3000.....分阶段但有连续性的数据
此处的插入方法为原始的JDBC连接sqlserver 进行的插入操作,连接过程不再赘述,插入代码也一并贴出
/** * 执行SqlServer数据库的插入操作 * * @param con 数据库连接对象 * @param dulAllList 需要进行插入的数据 * @param database * @throws SQLException */ public void insertDulDataForSqlServer(Connection con, List<TemplatePojo> dulAllList) throws SQLException { // 执行插入语句 PreparedStatement cmd = con .prepareStatement("insert into [EMR4].[dbo].[ET_DOCUMENT_STRUCTURED] values(?,?,?,?,?,?,?,?,?,?)"); // 执行 for (TemplatePojo templatePojo : dulAllList) { cmd.setString(1, templatePojo.getObjectId()); cmd.setString(2, templatePojo.getObjectName()); cmd.setString(3, templatePojo.getObjectType()); cmd.setString(4, templatePojo.getOwnersection()); cmd.setString(5, templatePojo.getObjectData()); cmd.setString(6, templatePojo.getObjectDataText()); cmd.setString(7, templatePojo.getObjectDataJson()); cmd.setString(8, templatePojo.getItemText()); cmd.setString(9, templatePojo.getDeptDocId()); cmd.setString(10, templatePojo.getEtType()); cmd.addBatch(); } cmd.executeBatch(); System.out.println("执行插入语句:"); // 提交需要执行的语句 con.commit(); cmd.close(); }