SpringBoot整合TDengine 3.0多数据源实战:从JDBC直连到MyBatisPlus动态切换
最近在做一个工业物联网项目,需要处理海量的传感器时序数据,比如温度、压力、电压这些每秒都在产生的指标。传统的MySQL在处理这类高频写入和按时间范围聚合查询时,很快就遇到了瓶颈。团队评估了几款时序数据库,最终选择了TDengine,看中的就是它宣称的高性能、SQL兼容性以及相对友好的开源协议。
但在实际引入过程中,我们面临一个很现实的问题:项目里已经存在大量的业务逻辑是基于MySQL和MyBatisPlus构建的,不可能把所有数据都迁移到TDengine。这就意味着,我们的SpringBoot应用需要同时与关系型数据库和时序数据库打交道,也就是所谓的“多数据源”场景。更具体地说,我们需要在同一个服务里,让部分DAO操作MySQL,另一部分DAO操作TDengine,并且两者要能平滑共存,互不干扰。
网上关于SpringBoot多数据源的资料不少,但结合TDengine这种特殊数据库的实战分享却不多见,尤其是涉及到连接方式选择、连接池调优、以及如何与MyBatisPlus优雅集成时,坑点不少。我花了些时间,把JDBC原生连接和基于dynamic-datasource-spring-boot-starter的动态数据源两种主流方案都实践了一遍,过程中也记录了一些性能对比和配置心得。这篇文章,我就把这些实战经验系统地梳理出来,希望能给面临类似场景的开发者提供一个清晰的参考路径。
1. 理解TDengine的连接方式与选型考量
在动手写代码之前,搞清楚TDengine的两种连接方式是至关重要的,这直接决定了后续整合的架构和性能基线。TDengine服务端主要由taosd核心进程和taosAdapter组件构成,客户端与之通信,主要就两条路:
- 原生连接:客户端驱动
taosc直接与taosd进程建立TCP连接。这是性能最高的方式,延迟最低,吞吐量最大。 - REST连接:客户端通过HTTP/RESTful API与
taosAdapter组件交互,再由taosAdapter转发请求给taosd。这种方式更通用,绕过了一些本地依赖。
两种方式在JDBC URL上就有明显区别:
// 原生连接 JDBC URL
jdbc:TAOS://192.168.1.100:6030/my_db
// REST连接 JDBC URL
jdbc:TAOS-RS://192.168.1.100:6041/my_db
端口号也不同,6030是taosd的默认端口,6041(或其他配置的端口)是taosAdapter的REST服务端口。
那么,在SpringBoot项目中我们该如何选择?
我的建议是,对于追求极致性能的生产环境,优先使用原生连接。官方文档也提到,REST连接的性能相比原生连接有大约30%的损耗。这个损耗对于写入密集型或高频查询的时序场景来说,是不能忽视的。
注意:如果你选择使用REST连接,务必确保TDengine服务器上的
taosAdapter服务已经启动。非Docker安装方式有时需要手动启动它:systemctl start taosadapter。
选择原生连接也意味着,部署应用的服务器上需要安装TDengine的客户端驱动(taosc)。这通常不是大问题,通过rpm或deb包安装即可。对于容器化部署,需要在构建Docker镜像时包含这个客户端库。
连接池的选择:无论是连接MySQL还是TDengine,生产环境都必须使用连接池。Druid凭借其强大的监控和防SQL注入能力,依然是很多团队的首选。HikariCP以性能著称,也是不错的选择。在本文的实践中,我会以Druid为例进行配置,并分享一些针对时序数据库场景的调优参数。
2. 方案一:基于JDBC与多数据源Bean的“硬核”整合
第一种方案比较“传统”,思路清晰:我们手动创建多个DataSource Bean,分别对应MySQL和TDengine。然后通过JdbcTemplate或者直接获取Connection来执行SQL。这种方案不依赖特定的多数据源框架,控制粒度细,适合对MyBatisPlus等ORM工具集成有顾虑,或者需要高度定制化JDBC操作的场景。
2.1 项目依赖与核心配置
首先,在pom.xml中引入必要的依赖。除了SpringBoot Web、Lombok等基础依赖,关键的是MySQL驱动、TDengine的JDBC驱动以及Druid连接池。
<dependencies>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- TDengine JDBC驱动 (使用原生连接) -->
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdb


4694

被折叠的 条评论
为什么被折叠?



