diff --git a/.gitignore b/.gitignore index 7bd9580..3ae01c5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ os_del.cmd os_del_doc.cmd .svn derby.log -*.log \ No newline at end of file +*.log +.qoder/ diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml index 51bd4ac..1a104c2 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml @@ -9,7 +9,7 @@ JOIN stas_sync_record r ON l.record_id = r.id WHERE (r.source_id = #{dataSourceId} OR r.target_id = #{dataSourceId}) AND l.error_type IN ('TIMEOUT', 'TRUNCATION') - AND l.start_time >= (CURRENT_DATE - INTERVAL '#{days}' DAY) + AND l.start_time >= (CURRENT_DATE - (#{days} * INTERVAL '1 day')) @@ -20,7 +20,7 @@ FROM stas_sync_record r WHERE (r.source_id = #{dataSourceId} OR r.target_id = #{dataSourceId}) AND r.end_time IS NOT NULL - AND r.start_time >= (CURRENT_DATE - INTERVAL '#{days}' DAY) + AND r.start_time >= (CURRENT_DATE - (#{days} * INTERVAL '1 day')) diff --git a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java index 0cdf2a9..add3580 100644 --- a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java +++ b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java @@ -164,7 +164,7 @@ public class SyncDataJob implements Job { && syncAdaptiveStrategy.shouldRetry(stasSyncStrategy)) { // 缩减批次大小并重试 int[] adjusted = syncAdaptiveStrategy.adjustBatchSize(stasSyncStrategy, isDate, - stasTaskConfig.getSyncDay(), stasTaskConfig.getSyncCount()); + stasTaskConfig.getSyncDay(), stasTaskConfig.getSyncCount(), errorType); effectiveSyncDay = adjusted[0]; effectiveSyncCount = adjusted[1]; diff --git a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/SyncAdaptiveStrategy.java b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/SyncAdaptiveStrategy.java index 912f44e..63539ae 100644 --- a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/SyncAdaptiveStrategy.java +++ b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/SyncAdaptiveStrategy.java @@ -8,6 +8,7 @@ import org.jeecg.modules.base.mapper.StasSyncStrategyMapper; import org.springframework.stereotype.Component; import java.sql.SQLException; +import java.sql.SQLTimeoutException; import java.util.Arrays; import java.util.List; @@ -38,7 +39,7 @@ public class SyncAdaptiveStrategy { private static final List ORACLE_TIMEOUT_KEYWORDS = Arrays.asList( "ORA-02396", "ORA-03113", "ORA-03114", "ORA-04030", "Closed Connection", "Connection timed out", "Read timed out", - "ORA-12571", "ORA-03135", "ORA-02396", "ORA-00054", + "ORA-12571", "ORA-03135", "ORA-00054", "No more data to read from socket", "Connection reset" ); @@ -139,7 +140,8 @@ public class SyncAdaptiveStrategy { * @return 调整后的[batchDay, batchCount] */ public int[] adjustBatchSize(StasSyncStrategy strategy, boolean isDateColumn, - int taskConfigSyncDay, int taskConfigSyncCount) { + int taskConfigSyncDay, int taskConfigSyncCount, + ErrorType errorType) { int minSyncDay = strategy.getMinSyncDay() != null ? strategy.getMinSyncDay() : DEFAULT_MIN_SYNC_DAY; int minSyncCount = strategy.getMinSyncCount() != null ? strategy.getMinSyncCount() : DEFAULT_MIN_SYNC_COUNT; @@ -152,7 +154,7 @@ public class SyncAdaptiveStrategy { strategy.setCurrentSyncDay(newSyncDay); strategy.setCurrentSyncCount(newSyncCount); strategy.setRetryCount(strategy.getRetryCount() != null ? strategy.getRetryCount() + 1 : 1); - strategy.setLastErrorType(ErrorType.TIMEOUT.name()); + strategy.setLastErrorType(errorType != null ? errorType.name() : ErrorType.OTHER.name()); stasSyncStrategyMapper.updateById(strategy); diff --git a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/TimeoutProbeService.java b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/TimeoutProbeService.java index d1ed87b..63f733b 100644 --- a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/TimeoutProbeService.java +++ b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/TimeoutProbeService.java @@ -39,8 +39,8 @@ public class TimeoutProbeService { private static final int PROBE_EXPIRE_DAYS = 7; /** 日志分析窗口天数 */ private static final int LOG_ANALYSIS_WINDOW_DAYS = 30; - /** 超时错误率阈值 */ - private static final double TIMEOUT_ERROR_RATE_THRESHOLD = 0.2; + /** 超时错误次数阈值(最近窗口期内出现此次数及以上则认为偏高) */ + private static final int TIMEOUT_ERROR_COUNT_THRESHOLD = 3; /** 连续无超时日志条数阈值(满足此条件则温和下调) */ private static final int CONSECUTIVE_NON_TIMEOUT_THRESHOLD = 5; @@ -173,16 +173,12 @@ public class TimeoutProbeService { int currentReadTimeout = dataSource.getDetectedReadTimeout() != null ? dataSource.getDetectedReadTimeout() : MIN_READ_TIMEOUT_SEC; - // 计算超时错误率 - int totalErrors = timeoutErrors; - double errorRate = totalErrors > 0 ? (double) timeoutErrors / Math.max(totalErrors, 1) : 0; - - if (errorRate > TIMEOUT_ERROR_RATE_THRESHOLD && avgSyncTimeMs != null && avgSyncTimeMs > 0) { - // 超时错误率过高,增大读取超时 + if (timeoutErrors >= TIMEOUT_ERROR_COUNT_THRESHOLD && avgSyncTimeMs != null && avgSyncTimeMs > 0) { + // 窗口期内超时次数偏高,增大读取超时 int newReadTimeout = (int) Math.max(currentReadTimeout * 1.5, (avgSyncTimeMs / 1000) * 3); - log.info("数据源[{}]超时错误率{}}过高,读取超时从{}s调整为{}s", - dataSource.getInstanceName(), String.format("%.2f", errorRate), + log.info("数据源[{}]最近{}天超时错误{}次偏高,读取超时从{}s调整为{}s", + dataSource.getInstanceName(), LOG_ANALYSIS_WINDOW_DAYS, timeoutErrors, currentReadTimeout, newReadTimeout); dataSource.setDetectedReadTimeout(newReadTimeout); stasDataSourceMapper.updateById(dataSource); @@ -297,7 +293,7 @@ public class TimeoutProbeService { * 解析PG时间间隔字符串为秒数(如 "5min", "30s", "2h") */ private int parsePgIntervalToSec(String value) { - if (value == null || "0".equals(value) || "-1".equals(value) || value.startsWith("0")) { + if (value == null || "0".equals(value.trim()) || "-1".equals(value.trim())) { return -1; } try { diff --git a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/impl/StasTaskConfigServiceImpl.java b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/impl/StasTaskConfigServiceImpl.java index a015477..a0340a0 100644 --- a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/impl/StasTaskConfigServiceImpl.java +++ b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/service/impl/StasTaskConfigServiceImpl.java @@ -253,7 +253,7 @@ public class StasTaskConfigServiceImpl extends ServiceImpl