fix: keep jt808 raw history consumer current
This commit is contained in:
@@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory;
|
||||
public final class TdengineJdbcHistoryWriter implements TdengineHistoryWriter {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(TdengineJdbcHistoryWriter.class);
|
||||
private static final int MAX_LITERAL_ROWS_PER_STATEMENT = 200;
|
||||
|
||||
private final DataSource dataSource;
|
||||
private final TdengineHistorySchema schema;
|
||||
@@ -179,26 +180,39 @@ public final class TdengineJdbcHistoryWriter implements TdengineHistoryWriter {
|
||||
|
||||
private static void executeLiteralBatch(Connection connection, LiteralBatch batch) throws SQLException {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
for (List<Object> row : batch.rows()) {
|
||||
statement.execute(toLiteralInsertSql(batch.insertSql(), row));
|
||||
List<List<Object>> rows = batch.rows();
|
||||
for (int start = 0; start < rows.size(); start += MAX_LITERAL_ROWS_PER_STATEMENT) {
|
||||
int end = Math.min(start + MAX_LITERAL_ROWS_PER_STATEMENT, rows.size());
|
||||
statement.execute(toLiteralInsertSql(batch.insertSql(), rows.subList(start, end)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String toLiteralInsertSql(String insertSql, List<Object> values) {
|
||||
private static String toLiteralInsertSql(String insertSql, List<List<Object>> rows) {
|
||||
int valuesIndex = insertSql.lastIndexOf("VALUES");
|
||||
if (valuesIndex < 0) {
|
||||
throw new IllegalArgumentException("insert SQL must contain VALUES: " + insertSql);
|
||||
}
|
||||
StringBuilder sql = new StringBuilder(insertSql.substring(0, valuesIndex))
|
||||
.append("VALUES (");
|
||||
for (int i = 0; i < values.size(); i++) {
|
||||
if (i > 0) {
|
||||
sql.append(", ");
|
||||
}
|
||||
sql.append(literal(values.get(i)));
|
||||
if (rows == null || rows.isEmpty()) {
|
||||
throw new IllegalArgumentException("literal rows must not be empty");
|
||||
}
|
||||
return sql.append(')').toString();
|
||||
StringBuilder sql = new StringBuilder(insertSql.substring(0, valuesIndex))
|
||||
.append("VALUES ");
|
||||
for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
|
||||
if (rowIndex > 0) {
|
||||
sql.append(' ');
|
||||
}
|
||||
List<Object> values = rows.get(rowIndex);
|
||||
sql.append('(');
|
||||
for (int i = 0; i < values.size(); i++) {
|
||||
if (i > 0) {
|
||||
sql.append(", ");
|
||||
}
|
||||
sql.append(literal(values.get(i)));
|
||||
}
|
||||
sql.append(')');
|
||||
}
|
||||
return sql.toString();
|
||||
}
|
||||
|
||||
private static String literal(Object value) {
|
||||
|
||||
Reference in New Issue
Block a user