diff --git a/.gitignore b/.gitignore index 3ae01c5..7bd9580 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,4 @@ os_del.cmd os_del_doc.cmd .svn derby.log -*.log -.qoder/ +*.log \ No newline at end of file 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 1a104c2..51bd4ac 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 - (#{days} * INTERVAL '1 day')) + AND l.start_time >= (CURRENT_DATE - INTERVAL '#{days}' 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 - (#{days} * INTERVAL '1 day')) + AND r.start_time >= (CURRENT_DATE - INTERVAL '#{days}' 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 add3580..0cdf2a9 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(), errorType); + stasTaskConfig.getSyncDay(), stasTaskConfig.getSyncCount()); 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 63539ae..912f44e 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,7 +8,6 @@ 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; @@ -39,7 +38,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-00054", + "ORA-12571", "ORA-03135", "ORA-02396", "ORA-00054", "No more data to read from socket", "Connection reset" ); @@ -140,8 +139,7 @@ public class SyncAdaptiveStrategy { * @return 调整后的[batchDay, batchCount] */ public int[] adjustBatchSize(StasSyncStrategy strategy, boolean isDateColumn, - int taskConfigSyncDay, int taskConfigSyncCount, - ErrorType errorType) { + int taskConfigSyncDay, int taskConfigSyncCount) { int minSyncDay = strategy.getMinSyncDay() != null ? strategy.getMinSyncDay() : DEFAULT_MIN_SYNC_DAY; int minSyncCount = strategy.getMinSyncCount() != null ? strategy.getMinSyncCount() : DEFAULT_MIN_SYNC_COUNT; @@ -154,7 +152,7 @@ public class SyncAdaptiveStrategy { strategy.setCurrentSyncDay(newSyncDay); strategy.setCurrentSyncCount(newSyncCount); strategy.setRetryCount(strategy.getRetryCount() != null ? strategy.getRetryCount() + 1 : 1); - strategy.setLastErrorType(errorType != null ? errorType.name() : ErrorType.OTHER.name()); + strategy.setLastErrorType(ErrorType.TIMEOUT.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 63f733b..d1ed87b 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 int TIMEOUT_ERROR_COUNT_THRESHOLD = 3; + /** 超时错误率阈值 */ + private static final double TIMEOUT_ERROR_RATE_THRESHOLD = 0.2; /** 连续无超时日志条数阈值(满足此条件则温和下调) */ private static final int CONSECUTIVE_NON_TIMEOUT_THRESHOLD = 5; @@ -173,12 +173,16 @@ public class TimeoutProbeService { int currentReadTimeout = dataSource.getDetectedReadTimeout() != null ? dataSource.getDetectedReadTimeout() : MIN_READ_TIMEOUT_SEC; - if (timeoutErrors >= TIMEOUT_ERROR_COUNT_THRESHOLD && avgSyncTimeMs != null && avgSyncTimeMs > 0) { - // 窗口期内超时次数偏高,增大读取超时 + // 计算超时错误率 + int totalErrors = timeoutErrors; + double errorRate = totalErrors > 0 ? (double) timeoutErrors / Math.max(totalErrors, 1) : 0; + + if (errorRate > TIMEOUT_ERROR_RATE_THRESHOLD && avgSyncTimeMs != null && avgSyncTimeMs > 0) { + // 超时错误率过高,增大读取超时 int newReadTimeout = (int) Math.max(currentReadTimeout * 1.5, (avgSyncTimeMs / 1000) * 3); - log.info("数据源[{}]最近{}天超时错误{}次偏高,读取超时从{}s调整为{}s", - dataSource.getInstanceName(), LOG_ANALYSIS_WINDOW_DAYS, timeoutErrors, + log.info("数据源[{}]超时错误率{}}过高,读取超时从{}s调整为{}s", + dataSource.getInstanceName(), String.format("%.2f", errorRate), currentReadTimeout, newReadTimeout); dataSource.setDetectedReadTimeout(newReadTimeout); stasDataSourceMapper.updateById(dataSource); @@ -293,7 +297,7 @@ public class TimeoutProbeService { * 解析PG时间间隔字符串为秒数(如 "5min", "30s", "2h") */ private int parsePgIntervalToSec(String value) { - if (value == null || "0".equals(value.trim()) || "-1".equals(value.trim())) { + if (value == null || "0".equals(value) || "-1".equals(value) || value.startsWith("0")) { 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 a0340a0..a015477 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