Переглянути джерело

Merge remote-tracking branch 'origin/mqy20260511'

mqy20260511
humanleft 2 тижднів тому
джерело
коміт
75f639e4d7

+ 29
- 1
iot-platform/src/main/java/com/iot/platform/service/TdEngineService.java Переглянути файл

@@ -44,6 +44,9 @@ public class TdEngineService {
44 44
     // 默认批量大小
45 45
     private static final int DEFAULT_BATCH_SIZE = 50;
46 46
 
47
+    // 每批次最大列数(防止 TDengine 行超限)
48
+    private static final int MAX_COLUMNS_PER_INSERT = 100;
49
+
47 50
     // 默认 VARCHAR 字段长度限制
48 51
     private static final int DEFAULT_VARCHAR_LENGTH = 255;
49 52
 
@@ -420,7 +423,32 @@ public class TdEngineService {
420 423
 
421 424
         try (Connection conn = getConnection(); Statement stmt = conn.createStatement()) {
422 425
             stmt.setQueryTimeout(30);
423
-            stmt.executeUpdate(sql);
426
+
427
+            // 如果列数过多,拆分成多个 INSERT
428
+            int totalCols = columnTypes.size();
429
+            if (totalCols > MAX_COLUMNS_PER_INSERT) {
430
+                log.warn("列数({})超过单次插入限制({}),开始拆分插入", totalCols, MAX_COLUMNS_PER_INSERT);
431
+                List<String> allColumns = new ArrayList<>(columnTypes.keySet());
432
+                int insertedCount = 0;
433
+                for (int i = 0; i < allColumns.size(); i += MAX_COLUMNS_PER_INSERT) {
434
+                    int end = Math.min(i + MAX_COLUMNS_PER_INSERT, allColumns.size());
435
+                    List<String> batchCols = allColumns.subList(i, end);
436
+
437
+                    Map<String, String> subColumnTypes = new LinkedHashMap<>();
438
+                    for (String col : batchCols) {
439
+                        subColumnTypes.put(col, columnTypes.get(col));
440
+                    }
441
+
442
+                    String subSql = buildInsertSql(dbName, table, superTableName, subColumnTypes, dataList);
443
+                    if (subSql != null) {
444
+                        stmt.executeUpdate(subSql);
445
+                        insertedCount += dataList.size();
446
+                    }
447
+                }
448
+                log.info("拆分插入完成 | 总列数: {} | 拆分批次数: {} | 插入行数: {}", totalCols, (totalCols + MAX_COLUMNS_PER_INSERT - 1) / MAX_COLUMNS_PER_INSERT, insertedCount);
449
+            } else {
450
+                stmt.executeUpdate(sql);
451
+            }
424 452
         } catch (SQLException e) {
425 453
             if (!isRetry && e.getMessage().contains("Table does not exist")) {
426 454
                 log.warn("表不存在,重建并重试: {}", table);

Завантаження…
Відмінити
Зберегти