diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/scheduler/SupplierAccountPullScheduler.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/scheduler/SupplierAccountPullScheduler.java index 1a54d01..b211d6e 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/scheduler/SupplierAccountPullScheduler.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/scheduler/SupplierAccountPullScheduler.java @@ -68,13 +68,15 @@ public class SupplierAccountPullScheduler return t; }); - /** 启动后立即全量拉取 1 个月数据 (异步, 不阻塞 Spring 启动) */ + /** 启动后推迟 30s 全量拉取 1 个月数据 (异步, 不阻塞 Spring 启动; 推迟避开启动期 Druid 池首批连接未就绪) */ @PostConstruct public void init() { startupExecutor.submit(() -> { try { + // 启动期 Druid 首批物理连接未建好, 推迟 30s 让连接池就绪, 避免大批失败 + Thread.sleep(30_000); log.info("[SupplierAccountPull] 启动全量拉取开始 (近 {} 天)", fullPullDays()); pull(fullPullDays() * 24 * 60); } @@ -142,11 +144,21 @@ public class SupplierAccountPullScheduler fetched += size; // 同步到执行方 sys_user / biz_org / biz_person (按邮箱 upsert) + // 切批 100 条/批, 批间 sleep 100ms 让连接池归还, 避免大批并发撑爆 Druid if (size > 0) { List accounts = objectMapper.convertValue(rows, new TypeReference>() {}); - supplierAccountSyncService.sync(accounts); + final int BATCH = 100; + for (int i = 0; i < accounts.size(); i += BATCH) + { + List batch = accounts.subList(i, Math.min(i + BATCH, accounts.size())); + supplierAccountSyncService.sync(batch); + if (i + BATCH < accounts.size()) + { + Thread.sleep(100); + } + } } log.info("[SupplierAccountPull] page={} total={} 本页={} 同步完成", pageNum, total, size);