Apache IoTDB C# 客户端双版本发布:V1.3.7 与 V2.0.8 解析及版本选择指南

11 min

写在前面

2026 年 4 月 15 日,Apache IoTDB C# 客户端(iotdb-client-csharp)同时发布了两个版本:

  • v1.3.7 — 1.x 分支的维护版本,同时可用于 2.x 数据库(仅限 Tree Model)
  • v2.0.8 — 面向 IoTDB 2.x 服务端的新一代客户端,不兼容 1.x 数据库

⚠️ 重要兼容性提示

两个版本的兼容方向是不对称的:

  • v2.0.8 无法连接 1.x 数据库。如果服务端仍在 IoTDB 1.x(例如 V1.3.6 / V1.3.7),必须使用 v1.3.7 客户端。
  • v1.3.7 可以连接 2.x 数据库,但只能使用 Tree Model,无法使用 2.x 新增的 Table Model。需要 Table Model 时才升级到 v2.0.8。

换句话说:v1.3.7 是兼容范围更广的”保守选择”,v2.0.8 是面向 2.x 新特性的”激进选择”

本文梳理以下内容:

  1. V1.3.7 的核心修复
  2. V2.0.8 的新特性与改进
  3. 1.x ↔ 2.x 兼容性边界
  4. 选型与升级建议

V1.3.7:稳定性修复,兼顾 1.x 与 2.x(Tree Model)

V1.3.7 是 1.x 分支的一次”小步快跑”维护版本,主要聚焦于会话管理和数据读取链路上的若干历史缺陷。

它的连接范围其实是两个大版本

  • 对 IoTDB 1.x 服务端 — 原生支持,推荐升级
  • 对 IoTDB 2.x 服务端 — 可用,但只能访问 Tree Model,无法使用 2.x 新增的 Table Model

对于生产环境中仍在使用 1.3.x 服务端、或者已升级到 2.x 但只需要 Tree Model 的用户,这是一次推荐升级

核心变更

变更项说明影响
SessionPool 客户端泄漏修复修复重连失败、查询失败时连接未正确归还的资源泄漏长时间运行的服务不再出现句柄/连接耗尽
服务端错误信息保留将服务端返回的错误消息原样透传给调用方调试更直接,不再被包装层吞掉
SessionDataSet 死锁修复修复数据集操作中的同步死锁高并发查询场景稳定性提升
RowRecord 构造函数升级迁移到 4 参数 RowRecord 构造函数更完整的数据结构表达

适用场景

  • 服务端是 IoTDB 1.3.x(含 1.3.6 / 1.3.7)
  • 服务端已是 2.x,但业务只使用 Tree Model、不需要 Table Model
  • 使用 SessionPool 且长时间运行
  • 需要在业务侧捕获服务端原始错误信息
  • 对数据读取链路的死锁问题敏感

完整 Changelogv1.3.4…v1.3.7


V2.0.8:面向 2.x 的新特性与协议适配

V2.0.8 是 2.x 分支的一次较大更新,既包含 V1.3.7 的全部稳定性修复,又引入了针对 IoTDB 2.x 服务端的新协议支持和安全能力。

新特性(New Features)

1. 支持 V2 读接口(C# Client support V2 read interface

这是 V2.0.8 最关键的变更。IoTDB 2.x 服务端在读取路径上引入了 V2 接口(更高效的数据编码、改进的列式传输),V2.0.8 客户端原生支持该接口。

这也是为什么 V2.0.8 无法连接 1.x 服务端 — 1.x 服务端不存在 V2 读接口的实现,协议握手阶段就会失败。

2. 支持 Client TLS

新增客户端侧 TLS 加密能力:

  • 面向跨网络/跨云边界的部署场景
  • 配合服务端 2.x 的 TLS 配置,可实现端到端的传输加密
  • 对金融、能源、政企等合规要求高的行业尤为重要

改进(Improvements)

改进项说明
NuGet 包元数据增强改进在 NuGet 上的可发现性与描述信息
Array.Reverse 替换 LINQ 反转跨 .NET 运行时(.NET Framework / .NET 6+ / .NET 8+)兼容性更好,性能略优

Bug 修复(继承自 V1.3.7 并新增)

  • SessionPool 客户端资源泄漏修复
  • 服务端错误信息保留
  • RpcDataSet 死锁条件修复
  • 时区兼容性问题修复(2.x 独有)
  • 列索引问题修复(2.x 独有)
  • 移除废弃代码

贡献者

本次 V2.0.8 由 4 位开发者贡献,包括首次参与的 thompson-tomo。从 v2.0.2 到 v2.0.8,共合并了 6 个主要 PR。

完整 Changelogv2.0.2…v2.0.8


1.x 与 2.x 的兼容性边界

这是本次发布中最容易踩坑的一点,单独拎出来讲清楚。兼容方向并不对称。

兼容性矩阵

客户端版本服务端 1.x (1.3.x)服务端 2.x (Tree Model)服务端 2.x (Table Model)
C# Client v1.3.7✅ 支持✅ 支持❌ 不支持
C# Client v2.0.8不支持✅ 支持✅ 支持

一句话概括:

  • v1.3.7 是”向上兼容”的:能连 1.x,也能连 2.x(只是用不了 Table Model)
  • v2.0.8 是”只向前不向后”的:只能连 2.x,但能用 Table Model

为什么 v2.0.8 连不上 1.x?

IoTDB 从 1.x 到 2.x 的演进不仅是版本号的递进,还带来了:

  1. RPC 协议层的重构 — 2.x 引入了 V2 读接口,是一套新的 Thrift 定义
  2. 数据模型的扩展 — 2.x 新增 Table Model(表模型),与 Tree Model 并存
  3. 会话与元数据交互路径变化 — 例如 Database 概念替代了 Storage Group

V2.0.8 客户端默认走 V2 读接口和新的会话路径,而 1.x 服务端不存在这些实现,握手阶段就会失败:

连接阶段:握手报错 / 协议版本不匹配
查询阶段:响应解析异常 / 字段错位
写入阶段:schema 校验失败

为什么 v1.3.7 还能连 2.x?

2.x 服务端保留了对旧版 RPC 接口和 Tree Model 的向后兼容,因此 v1.3.7 客户端发出的 1.x 风格请求仍能被正确处理。代价是:

  • Table Model 相关的 API、DDL、查询在 v1.3.7 里不存在 — 客户端根本不会调用这些接口
  • 无法享受 V2 读接口带来的性能优化
  • 缺少 v2.0.8 独有的 Client TLS 能力

如何确认服务端版本

在 CLI 或通过 SQL 查询:

SHOW VERSION;

根据返回结果选择对应的 C# 客户端版本。


选型与升级建议

场景一:服务端在 1.3.x,短期不升级

建议:使用 Apache.IoTDB 的 v1.3.7。

<!-- csproj -->
<PackageReference Include="Apache.IoTDB" Version="1.3.7" />

收益:修复了 SessionPool 泄漏与 SessionDataSet 死锁,长时间运行的 .NET 服务会更稳定。

场景二:服务端已升级到 2.x,但业务只用 Tree Model

建议依然用 v1.3.7 即可,不必强行切到 v2.0.8。

<PackageReference Include="Apache.IoTDB" Version="1.3.7" />

理由:

  • v1.3.7 能正常连接 2.x 服务端并读写 Tree Model 数据
  • 无需为”升级客户端”付出回归测试成本
  • 只有以下情况才需要升到 v2.0.8:
    • 需要使用 Table Model
    • 需要 Client TLS 加密
    • 想要 V2 读接口的性能提升

场景三:服务端是 2.x,且需要 Table Model / TLS / V2 读接口

建议:升级到 v2.0.8。

<PackageReference Include="Apache.IoTDB" Version="2.0.8" />

切换时关注:TLS 配置、时区设置、V2 读接口带来的性能与行为变化。参考服务端版本解析:IoTDB V2.0.7 与 V1.3.7 解析V2.0.8 版本解析

场景四:混合集群(部分 1.x、部分 2.x)

建议统一使用 v1.3.7 是最简单的做法——一套客户端即可覆盖两种服务端(Tree Model 范围内)。

如果 2.x 集群上必须使用 Table Model,则需按目标集群做隔离:

  • 在 DI 容器中按配置切换 ISessionPool 的实现版本
  • 或以微服务方式将 1.x 与 2.x 的访问拆到不同服务中

更省事的替代方案:如果你的 2.x 集群暂时还不用 Table Model,直接全量使用 v1.3.7 就能同时覆盖 1.x 和 2.x 服务端,省去上述的拆分工作。等到真的需要 Table Model 时再考虑迁移到 v2.0.8。

通用注意事项

  • TLS:v2.0.8 引入 Client TLS,服务端也需启用相应证书,否则握手失败。
  • 时区:v2.0.8 修复了时区兼容性问题,升级后原本靠客户端”歪打正着”跑通的时区逻辑需要重新核对。
  • 列索引:如果此前的业务代码依赖特定列索引顺序,v2.0.8 升级后请用单元测试回归一遍。
  • SessionPool:两个版本都修复了资源泄漏,但升级后也要检查业务侧是否有未 Dispose 的路径,修复只是让正确用法变得更稳健,并不能掩盖错误用法。

小结

维度V1.3.7V2.0.8
目标服务端IoTDB 1.x 和 2.x(Tree Model)IoTDB 2.x(含 Table Model)
能否连接 1.x 服务端
能否连接 2.x 服务端✅(仅 Tree Model)✅(Tree + Table Model)
新特性V2 读接口、Client TLS
稳定性修复SessionPool / SessionDataSet / 错误透传同 V1.3.7 + 时区 + 列索引
推荐升级策略适用大多数场景的保守选择需要 Table Model / TLS 时升级

一句话总结v1.3.7 是兼容性最广的选择,能同时覆盖 1.x 和 2.x 服务端(Tree Model);v2.0.8 是面向 2.x 新特性的选择,需要 Table Model 或 Client TLS 时才升级,但注意它无法连接 1.x 数据库。


参考链接