為了提高大數據量的插入數據,對將要存入的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(); }
