From 12253875406a93c2cc0f02d4abc87505e9898b15 Mon Sep 17 00:00:00 2001 From: ludc Date: 星期日, 12 十一月 2023 20:20:03 +0800 Subject: [PATCH] 历史数据导入,单次导入超过800条报错变量溢出bug --- Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java | 55 +++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 43 insertions(+), 12 deletions(-) diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java index 886df4a..a515f25 100644 --- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java @@ -103,10 +103,22 @@ public class MdmEngineServiceImpl implements MdmEngineService { /** + * 澶氱嚎绋嬫柟寮忔壒閲忔墽琛屽紑鍚嚎绋嬫睜鐨勬�绘暟 + */ + @Value("${batchadd.thread_num:10}") + private Integer THREAD_NUM; + + /** * 鍗曟sql鐨勬渶澶氬鍏ユ暟閲� */ - @Value("${batchadd.single_maxnum:500}") + @Value("${batchadd.single_maxnum:200}") private Integer MAX_IMPORT_NUM; + + /** + * 鏄惁寮�鍚绾跨▼鏂瑰紡瀵煎叆鍘嗗彶鏁版嵁 + */ + @Value("${batchadd.is_thread_import:false}") + private boolean IS_THREAD_IMPORT; /** * 妯℃澘鐨勬湇鍔� @@ -419,7 +431,7 @@ * @param orderDTO 鐢宠鐨勪俊鎭紝闇�瑕佸寘鍚睘鎬х殑鍐呭鍜岀爜娈电浉鍏崇殑鍐呭 * @return 杩斿洖缂栫爜鐨勫唴瀹� */ - private String addSaveCode(CodeOrderDTO orderDTO,boolean authUser) throws Exception { + private String addSaveCode(CodeOrderDTO orderDTO, boolean authUser) throws Exception { VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬у拰鐮佹鐨勫唴瀹归兘涓虹┖", orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭", orderDTO.getTemplateOid(), "妯℃澘鐨勪富閿�", orderDTO.getCodeRuleOid(), "缂栫爜瑙勫垯鐨勪富閿�"); CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid()); @@ -3532,7 +3544,6 @@ * @return 澶勭悊鎴愬姛鏁版嵁鏉℃暟 */ @Override - @Transactional(rollbackFor = Exception.class) public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) { //浣跨敤浼犲叆鐨勪笟鍔$被鍨嬫煡璇㈣〃 R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType)); @@ -3557,28 +3568,33 @@ throw new VciBaseException("绫诲瀷杞崲閿欒锛�" + e.toString()); } }); - try { - bactchExecuteInsert(listR.getData().get(0).getTableName(),maps); - }catch (Exception e){ - throw new ServiceException("鍒嗘壒鎵цinsert璇彞鎶ラ敊:"+e.getMessage()); + // 鏄惁寮�鍚绾跨▼鎵ц鎻掑叆璇彞 + if(IS_THREAD_IMPORT){ + try { + threadBactchExecuteInsert(listR.getData().get(0).getTableName(),maps); + }catch (Exception e){ + throw new ServiceException("鍒嗘壒鎵цinsert璇彞鎶ラ敊:"+e.getMessage()); + } + }else { + bacthExcecuteInsert(listR.getData().get(0).getTableName(),maps); } + return maps.size(); } /** - * 鍒嗘壒鎵цinsert璇彞 + * 澶氱嚎绋嬫柟寮忓垎鎵规墽琛宨nsert璇彞 * @param tableName * @param maps * @throws ServiceException */ - @Transactional(rollbackFor = Exception.class) - void bactchExecuteInsert(String tableName, List<Map<String, String>> maps) throws ServiceException{ - ExecutorService executor = Executors.newFixedThreadPool(10); // 鍒涘缓涓�涓浐瀹氬ぇ灏忕殑绾跨▼姹� + private void threadBactchExecuteInsert(String tableName, List<Map<String, String>> maps) throws ServiceException{ + ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUM); // 鍒涘缓涓�涓浐瀹氬ぇ灏忕殑绾跨▼姹� List<Map<String, String>> threadSafeMaps = new CopyOnWriteArrayList<>(maps); for (int i = 0; i < threadSafeMaps.size(); i += MAX_IMPORT_NUM) { final int startIndex = i; - final int endIndex = Math.min(i + MAX_IMPORT_NUM, maps.size()); + final int endIndex = Math.min(i + MAX_IMPORT_NUM, threadSafeMaps.size()); executor.execute(() -> { List<Map<String, String>> subList = threadSafeMaps.subList(startIndex, endIndex); @@ -3599,6 +3615,21 @@ } /** + * 鍗曠嚎绋嬫柟寮忓垎鎵规墽琛� + * @param tableName + * @param maps + */ + private void bacthExcecuteInsert(String tableName, List<Map<String, String>> maps){ + for (int i = 0; i < maps.size(); i += MAX_IMPORT_NUM) { + final int startIndex = i; + final int endIndex = Math.min(i + MAX_IMPORT_NUM, maps.size()); + List<Map<String, String>> subList = maps.subList(startIndex, endIndex); + // 璋冪敤鎻掑叆鏁版嵁搴撶殑鏂规硶 + commonsMapper.insertByBaseModel(tableName, maps.get(0), subList); + } + } + + /** * 浼犲叆涓氬姟绫诲瀷浠ュ強ID鏌ヨ涓氬姟琛ㄦ暟鎹槸鍚﹂噸澶� * * @param btmType 涓氬姟绫诲瀷 -- Gitblit v1.9.3