TDengine 3.0多数据源实战:从部署到SpringBoot集成

张开发
2026/4/7 4:39:36 15 分钟阅读

分享文章

TDengine 3.0多数据源实战:从部署到SpringBoot集成
1. TDengine 3.0 多数据源实战概述在物联网和大数据时代时序数据库Time-Series Database的需求日益增长。TDengine 作为一款开源的时序数据库凭借其高性能、高压缩比和易用性在工业物联网、车联网、IT运维监控等领域获得了广泛应用。3.0版本在原有基础上进行了全面升级支持更强大的多数据源管理能力。对于开发者而言在实际项目中往往需要同时连接多种数据库。比如一个智能工厂监控系统可能需要同时操作MySQL存储设备元数据、TDengine存储传感器时序数据和Redis缓存实时告警。传统做法是为每个数据库单独配置连接但这样会导致代码臃肿、维护困难。TDengine 3.0的多数据源支持配合SpringBoot的灵活配置可以优雅地解决这个问题。本文将手把手带你完成三个关键步骤首先是TDengine 3.0的安装部署包括Linux环境下的详细配置然后对比分析REST连接与原生连接两种远程访问方式的优劣最后通过两个完整的SpringBoot项目示例分别演示基础JDBC方案和MyBatis Plus集成方案实现多数据源的高效管理。2. TDengine 3.0 安装与部署2.1 版本选择与环境准备我选择的是3.0.7.1版本这是目前3.x系列中的稳定版本。与2.x相比3.x版本在分布式架构、SQL兼容性和性能方面都有显著提升。官方也推荐新项目直接使用3.x版本老项目可以考虑从2.x升级。虽然TDengine支持Windows安装但考虑到生产环境性能和稳定性建议使用Linux系统。我这里使用的是CentOS 7.9配置为4核CPU、8GB内存的云服务器。安装前需要确保系统已安装基础的开发工具链# 安装基础依赖 yum install -y wget tar make gcc2.2 安装步骤详解从官网下载对应版本的安装包后执行以下命令完成安装# 下载安装包请替换为最新版本链接 wget https://www.taosdata.com/assets-download/TDengine-server-3.0.7.1-Linux-x64.tar.gz # 解压安装包 tar -zxvf TDengine-server-3.0.7.1-Linux-x64.tar.gz # 进入解压目录 cd TDengine-server-3.0.7.1 # 执行安装脚本 ./install.sh安装过程会提示设置管理员密码默认为taosdata建议修改为复杂密码。安装完成后TDengine会自动注册为系统服务可以通过systemctl管理# 启动服务 systemctl start taosd # 设置开机自启 systemctl enable taosd # 查看服务状态 systemctl status taosd2.3 验证安装安装成功后在/usr/local/taos/bin目录下会有多个可执行文件。最常用的是taos客户端工具可以用来连接数据库并执行SQL# 连接本地数据库 taos -u root -p # 执行简单查询 show databases;如果看到系统默认的log数据库说明安装成功。此时还可以通过taosAdapter提供的REST接口访问但需要额外启动服务# 启动taosAdapter systemctl start taosadapter # 验证REST接口 curl -u root:taosdata http://localhost:6041/rest/sql -d show databases3. 远程连接方式对比3.1 两种连接方式原理TDengine提供两种远程连接方式原生连接和REST连接。原生连接通过taosc驱动直接与服务端taosd通信性能更高REST连接则通过taosAdapter提供的HTTP接口访问兼容性更好。在实际项目中我测试发现原生连接的查询速度比REST连接快30%左右。对于高并发、低延迟的场景建议使用原生连接而对于需要通过防火墙或跨语言调用的场景REST连接更方便。3.2 使用DBeaver连接DBeaver是常用的数据库管理工具支持通过REST连接TDengine。配置步骤如下下载安装最新版DBeaver新建连接选择TDengine驱动填写连接信息URL格式jdbc:TAOS-RS://服务器IP:6041/数据库名用户名/密码安装时设置的root密码测试连接注意使用REST连接时必须确保taosAdapter服务已启动。连接成功后可以像操作MySQL一样执行SQL、查看表结构等。3.3 原生连接配置原生连接的JDBC URL格式为jdbc:TAOS://服务器IP:6030/数据库名?charsetUTF-8localeen_US.UTF-8timezoneUTC-8相比REST连接原生连接需要确保客户端与服务器之间的6030端口畅通。如果遇到连接问题可以检查以下几点服务器防火墙是否开放6030端口taosd服务是否正常运行客户端与服务器版本是否兼容4. SpringBoot集成多数据源4.1 基础JDBC方案我们先看一个不依赖MyBatis的方案直接使用JDBC操作多数据源。这种方案的优势是轻量级适合简单查询场景。4.1.1 项目配置pom.xml关键依赖dependency groupIdcom.taosdata.jdbc/groupId artifactIdtaos-jdbcdriver/artifactId version3.2.4/version /dependency dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.16/version /dependencyapplication.yml配置两个数据源spring: datasource: druid: one: # MySQL数据源 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test username: root password: 123456 two: # TDengine数据源 driver-class-name: com.taosdata.jdbc.TSDBDriver url: jdbc:TAOS://192.168.1.100:6030/mp_test username: root password: taosdata4.1.2 数据源配置类创建DataSourceConfig配置类声明两个数据源BeanConfiguration public class DataSourceConfig { Bean(name mysqlDataSource) Primary ConfigurationProperties(prefix spring.datasource.druid.one) public DataSource mysqlDataSource() { return DruidDataSourceBuilder.create().build(); } Bean(name tdengineDataSource) ConfigurationProperties(prefix spring.datasource.druid.two) public DataSource tdengineDataSource() { return DruidDataSourceBuilder.create().build(); } }4.1.3 使用示例在Service中注入数据源直接使用JDBC操作Service public class DataService { Autowired Qualifier(tdengineDataSource) private DataSource tdengineDataSource; public void insertData(Timestamp ts) throws SQLException { String sql INSERT INTO bfh.dn_bfh202203450556 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); try (Connection conn tdengineDataSource.getConnection(); TSDBPreparedStatement pstmt conn.prepareStatement(sql) .unwrap(TSDBPreparedStatement.class)) { pstmt.setTimestamp(1, ts); for (int i 2; i 21; i) { pstmt.setFloat(i, new Random().nextFloat() * 100); } pstmt.executeUpdate(); } } }4.2 MyBatis Plus集成方案对于复杂项目推荐使用MyBatis Plus配合dynamic-datasource-spring-boot-starter实现多数据源管理。4.2.1 项目配置pom.xml新增依赖dependency groupIdcom.baomidou/groupId artifactIddynamic-datasource-spring-boot-starter/artifactId version3.5.1/version /dependencyapplication.yml配置动态数据源spring: datasource: dynamic: primary: mysql datasource: mysql: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test username: root password: 123456 tdengine: driver-class-name: com.taosdata.jdbc.TSDBDriver url: jdbc:TAOS://192.168.1.100:6030/mp_test username: root password: taosdata4.2.2 使用示例在Mapper接口上使用DS注解指定数据源Mapper DS(tdengine) public interface TemperatureMapper extends BaseMapperTemperature { Update(CREATE TABLE if not exists temperature(ts timestamp, temperature float) tags(location nchar(64), tbIndex int)) int createSuperTable(); Insert(insert into t${tbIndex}(ts, temperature) values(#{ts}, #{temperature})) int insertOne(Temperature one); }Service层同样可以使用DS注解切换数据源Service DS(mysql) public class DeviceService extends ServiceImplDeviceMapper, Device { // 默认使用mysql数据源 } Service public class MonitorService { Autowired private DeviceService deviceService; Autowired private TemperatureMapper temperatureMapper; DSTransactional // 多数据源事务注解 public void addDeviceWithData(Device device, Temperature temp) { deviceService.save(device); // 切换到TDengine数据源 temperatureMapper.insertOne(temp); } }5. 性能优化实践5.1 批量插入优化TDengine对批量插入有很好的支持实测批量插入1000条记录比单条插入快50倍以上。以下是使用JDBC批量插入的示例public void batchInsert(ListTemperature dataList) throws SQLException { String sql INSERT INTO ? VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); try (Connection conn tdengineDataSource.getConnection(); TSDBPreparedStatement pstmt conn.prepareStatement(sql) .unwrap(TSDBPreparedStatement.class)) { // 设置表名 pstmt.setTableName(bfh.dn_bfh202203450556); // 设置时间戳列 ListLong tsList dataList.stream() .map(t - t.getTs().getTime()) .collect(Collectors.toList()); pstmt.setTimestamp(0, tsList); // 设置温度值列 for (int i 1; i 20; i) { ListFloat values dataList.stream() .map(t - t.getTemperature()) .collect(Collectors.toList()); pstmt.setFloat(i, values); } // 执行批量插入 pstmt.columnDataAddBatch(); pstmt.columnDataExecuteBatch(); } }5.2 连接池配置合理的连接池配置对性能影响很大。根据官方建议连接数可按以下公式计算连接数 (CPU核心数 × 2) 有效磁盘数对于TDengine数据源建议配置如下spring: datasource: druid: initial-size: 10 min-idle: 10 max-active: 20 validation-query: select server_status() test-on-borrow: false test-on-return: false5.3 查询优化TDengine作为时序数据库在查询方面有一些特殊优化技巧尽量指定时间范围避免全表扫描对小表使用LAST_ROW函数获取最新记录对超级表使用PARTITION BY子句提高查询效率合理设置缓存参数vim /etc/taos/taos.cfg# 查询缓存大小MB queryCacheSize 100 # 每个查询使用的最大内存MB maxMemoryUsagePerQuery 5126. 常见问题解决在实际项目中我遇到过几个典型问题这里分享解决方案时区问题TDengine默认使用UTC时间可以在JDBC URL中添加timezone参数jdbc:TAOS://127.0.0.1:6030/mp_test?timezoneAsia/Shanghai乱码问题确保连接参数指定了正确的字符集jdbc:TAOS://127.0.0.1:6030/mp_test?charsetUTF-8连接超时调整taos.cfg中的网络参数# 客户端超时毫秒 shellActivityTimer 3000 # 心跳间隔秒 heartbeatInterval 30REST连接失败检查taosAdapter日志journalctl -u taosadapter -f内存不足调整taosd的内存限制# 最大内存使用MB maxMemoryUsage 8000通过本文的实践指南你应该已经掌握了TDengine 3.0多数据源的核心用法。从安装部署到SpringBoot集成从性能优化到问题排查这些经验都来自实际项目的积累。TDengine作为国产时序数据库的佼佼者在物联网、工业互联网等领域有着广阔的应用前景值得深入学习和应用。

更多文章