fix: initialize tdengine schema before first write

This commit is contained in:
lingniu
2026-06-29 14:28:53 +08:00
parent 57ba7dca90
commit 2273d72e95
2 changed files with 42 additions and 0 deletions

View File

@@ -20,6 +20,8 @@ public final class TdengineJdbcHistoryWriter implements TdengineHistoryWriter {
private final DataSource dataSource;
private final TdengineHistorySchema schema;
private final TdengineHistoryStatements statements;
private final Object schemaInitializationMonitor = new Object();
private volatile boolean schemaInitialized;
public TdengineJdbcHistoryWriter(DataSource dataSource, TdengineHistorySchema schema) {
if (dataSource == null) {
@@ -41,6 +43,7 @@ public final class TdengineJdbcHistoryWriter implements TdengineHistoryWriter {
}
}
});
schemaInitialized = true;
}
@Override
@@ -62,7 +65,29 @@ public final class TdengineJdbcHistoryWriter implements TdengineHistoryWriter {
if (rows == null || rows.isEmpty()) {
return;
}
if (!schemaInitialized) {
synchronized (schemaInitializationMonitor) {
if (!schemaInitialized) {
append(rows, mapper, true);
schemaInitialized = true;
return;
}
}
}
append(rows, mapper, false);
}
private <T> void append(List<T> rows,
Function<T, TdengineBatchStatement> mapper,
boolean initializeSchema) throws IOException {
inTransaction(connection -> {
if (initializeSchema) {
try (Statement statement = connection.createStatement()) {
for (String sql : schema.bootstrapSql()) {
statement.execute(sql);
}
}
}
Set<String> createdChildTables = new LinkedHashSet<>();
Map<String, PreparedStatement> preparedStatements = new LinkedHashMap<>();
try {