Skip to content

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

Description

@Qiaofanxing

环境

  • 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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions