|
|
@@ -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);
|