11-TDengine 时序库¶
📄 创建: ZCode AI 2026-08-14 · 修改: JimWb 2026-08-14
tdengine(10 个类)封装 TDengine(涛思数据时序数据库)的 JDBC/REST 双模式访问,提供超级表/子表的 DDL、批量写入、查询执行能力。包路径:cn.cnbm.energy.db.tdengine。⚠️ 注意:本模块的类不是 Spring Bean,需手动创建实例管理生命周期。
一、DbManager(连接池版,主类)¶
cn.cnbm.energy.db.tdengine.DbManager
连接初始化(两种模式)¶
| 方法 | 模式 | 说明 |
|---|---|---|
initDbJni(String url) |
JNI(连接池) | HikariCP(minIdle=3, maxPoolSize=10, validationQuery=show databases) |
initDbRest(String url) |
REST | 解析 url 提取 user/passwd/db/host,生成 Basic Auth,用 HttpClient |
URL 示例:
# JNI
jdbc:TAOS://192.168.1.115:6030/db2?user=root&password=taosdata
# REST(自动用 :6041 端口)
jdbc:TAOS://192.168.1.115:6041/db2?user=root&password=taosdata
内部枚举
CON_TYPE { RESTFUL, JNI },静态变量type控制模式(默认 JNI)。
DDL 操作¶
| 方法签名 | 功能 |
|---|---|
createEntityTable(String tableName, List<Column> cols) |
建普通表 |
createStable(Stable stable) |
建超级表(委托 Stable.createTable() 生成 SQL) |
createTableFromSt(String stableName, String tableName, List<Column> tagList, boolean deleteOld) |
通过超级表建子表:create table X using Y tags(...) |
deleteTable(String name) |
drop table if exists |
checkStableColumns(String tableName, List<Column> cols) |
检查超级表列,缺失则 alter table add column |
deleteColumn(String tableName, List<String> fields) |
alter table drop column |
数据写入¶
| 方法签名 | 功能 |
|---|---|
insertBatch(List<InsertObj> objs) |
按 maxSqlLength(65480) 分批拼接 insert into,超长先执行再续拼 |
insertBatchEx(List<InsertObj> objs) |
同上,但异常抛 IOException |
importBatch(List<InsertObj> objs) |
用 import into(TDengine 快速导入语法) |
查询¶
| 方法签名 | 功能 |
|---|---|
executeQuery(String sql) |
按 type 分发 REST 或 JNI |
executeQuery(List<String> sqls) |
批量查询(每条间 sleep 10ms) |
getTableInfos(String tableName) |
describe 表,返回 Map<超级表名, List |
getAllTables() |
show tables,返回 Map |
tableExist(String tableName) |
通过 describe 是否报错判断 |
查询结果处理:
- 时间戳格式化为 yyyy-MM-dd HH:mm:ss
- DOUBLE/DECIMAL/FLOAT 用 NumberFormat 按 digits(默认 2 位)+ roundingMode(默认 UP)格式化
- 遇 invalid resultset pointer 自动重连
- 兼容 TDengine 2.x(head 字段)和 3.x(column_meta 字段)
配置¶
DbManager manager = new DbManager();
manager.setDigits(3); // 查询数值精度(默认 2)
manager.setRoundingMode(RoundingMode.HALF_UP); // 舍入模式
二、DbManagerSingle(单连接版)¶
cn.cnbm.energy.db.tdengine.DbManagerSingle
API 与 DbManager 几乎一致,区别:
- JNI 模式用单个 Connection(DriverManager.getConnection)而非连接池
- getTableInfos 未做 3.0 byte[] 兼容
- executeQueryRest 只兼容 2.x
三、数据对象(objs 包)¶
Column¶
cn.cnbm.energy.db.tdengine.objs.Column
| 字段 | 类型 | 说明 |
|---|---|---|
columnName |
String | 列名 |
columnType |
ColumnType | 列类型 |
size |
int | 长度 |
getRealSize():对 BINARY/NCHAR 返回 (bytes)。
ColumnType(枚举)¶
| 枚举值 | 类型名 | 说明 |
|---|---|---|
| TIMESTAMP | timestamp | 时间戳 |
| INT | int | 整型 |
| BIGINT | bigint | 长整型 |
| TM | bigint | 等同 bigint |
| FLOAT | float | 单精度 |
| DOUBLE | double | 双精度 |
| BINARY | binary | 二进制字符串 |
| SMALLINT | smallint | 短整型 |
| TINYINT | tinyint | 微整型 |
| BOOL | bool | 布尔 |
| NCHAR | nchar | 定长字符串 |
ColumnType.parseType(String type) 静态方法反查枚举。
InsertObj¶
| 字段 | 类型 | 说明 |
|---|---|---|
tableName |
String | 表名 |
values |
List |
值列表 |
getSql():懒加载生成 tableName (col1,col2) values (v1,v2) SQL。
InsertValue¶
| 字段 | 类型 | 说明 |
|---|---|---|
value |
Object | 值 |
type |
String | 类型 |
colName |
String | 列名 |
getValSql():TIMESTAMP/BINARY/BOOL/NCHAR 加单引号;数值类型用 DecimalFormat("#.####") 格式化。
Stable(超级表模型)¶
| 字段 | 说明 |
|---|---|
name |
超级表名 |
cols |
List |
tags |
List |
tableInfos |
表信息 |
createTable() 生成建表 SQL:create table name (col1 type1(size),...) tags(tag1 type1,...)
四、完整使用示例¶
// 1. 初始化(JNI 连接池)
DbManager manager = new DbManager();
manager.initDbJni("jdbc:TAOS://192.168.1.115:6030/energy?user=root&password=taosdata");
// 2. 建超级表
Stable stable = new Stable();
stable.setName("device_data");
stable.setCols(Arrays.asList(
new Column("ts", ColumnType.TIMESTAMP),
new Column("value", ColumnType.DOUBLE)
));
stable.setTags(Arrays.asList(
new Column("device_id", ColumnType.BINARY)
));
manager.createStable(stable);
// 3. 建子表
manager.createTableFromSt("device_data", "dev_001",
Arrays.asList(new Column("dev_001", ColumnType.BINARY)), true);
// 4. 写入数据
List<InsertObj> batch = new ArrayList<>();
InsertObj obj = new InsertObj();
obj.setTableName("dev_001");
obj.setValues(Arrays.asList(
new InsertValue(System.currentTimeMillis(), "TIMESTAMP", "ts"),
new InsertValue(42.5, "DOUBLE", "value")
));
batch.add(obj);
manager.insertBatch(batch);
// 5. 查询
List<Map<String, Object>> result = manager.executeQuery(
"SELECT * FROM dev_001 WHERE ts > NOW - 1h");
// 时间已格式化,数值已按精度截断
// 6. 检查列(缺失自动加列)
manager.checkStableColumns("device_data", Arrays.asList(
new Column("quality", ColumnType.INT)
));
五、注意事项¶
⚠️ 以下几点在使用时务必注意,详见 12-FAQ与注意事项。
- 不是 Spring Bean:需手动
new DbManager()创建实例并管理生命周期 type是静态变量:全局影响所有实例,多数据源场景需注意- 版本兼容:REST 模式需注意 TDengine 2.x 和 3.x 的字段差异(
headvscolumn_meta) - 数值精度:查询结果默认 2 位小数四舍五入,可通过
setDigits()调整
相关文档¶
- 02-模块依赖与架构 — 模块依赖关系
- 05-业务服务层 — BaseServiceImpl 提供 TDengine 日期格式化
- 12-FAQ与注意事项 — type 静态变量多数据源限制