Skip to content

Java WebSocket JDBC 的 schemaless 写入性能明显低于原生 JDBC,慢一个数量级 #35361

Description

@nympheon

环境

  • TDengine JDBC Driver: taos-jdbcdriver 3.8.3
  • Java: 21.0.8
  • Spring Boot: 3.4.5
  • 连接池: HikariCP 6.3.0
  • 写入 API: AbstractConnection.write(lines, SchemalessProtocolType.LINE, SchemalessTimestampType.MILLI_SECONDS)

数据库在本机docker中部署,为最新版本3.4.1

原生连接配置:

tdengine:
  url: jdbc:TAOS://:/名称
  driver-class-name: com.taosdata.jdbc.TSDBDriver

WebSocket 连接配置:

tdengine:
  url: jdbc:TAOS-WS://localhost:6041/名称
  driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver

测试逻辑
两种连接方式使用完全相同的 Java 写入逻辑,只切换 JDBC URL 和 driver class。写入数据的时间严格顺序递增,没有乱序写入。

伪代码如下:

Map<String, Double> realtimeData = loadRealtimeDataOnce(); // 8973 个点

for (LocalDateTime ts = startTime; !ts.isAfter(endTime); ts = ts.plusMinutes(5)) {
    long start = System.currentTimeMillis();

    List<String> lines = buildInfluxLineProtocol(realtimeData, ts);

    jdbcTemplate.execute((ConnectionCallback<Object>) con -> {
        AbstractConnection taosCon = con.unwrap(AbstractConnection.class);
        taosCon.write(
            lines.toArray(new String[0]),
            SchemalessProtocolType.LINE,
            SchemalessTimestampType.MILLI_SECONDS
        );
        return null;
    });

    log.info("write cost: {} ms, points: {}", System.currentTimeMillis() - start, realtimeData.size());
}

测试时间范围共 3744 个时间点,每 5 分钟一个时间点。每个时间点写入约 8973 个点值。
原生 JDBC 平均每个时间点耗时: 142ms
WebSocket JDBC 平均每个时间点耗时: 1340ms
WebSocket写入速度明显无法接受,文档里面写Java的原生连接方式即将弃用,但是WebSocket根本无法替代

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions