Spring Boot集成TDengine实战:工业时序数据存储选型与迁移方案

分享一个工业时序数据存储的选型和迁移实战经验。

场景描述

某3C代工厂,产线上多台视觉检测设备,每台每秒钟产生30-50条检测结果。业务需求:查询任意7天良率趋势(响应1秒以内)、查询某批次产品检测记录(响应500ms以内)、数据保留1年。

初始方案及问题

用PostgreSQL存储。表结构包含时间、产品ID、缺陷类型、判定结果等字段。

数据量到500万条时问题暴露:

|--------|-------------------|
| 问题 | 表现 |
| 7天趋势查询 | 从200ms退化到15秒 |
| 批量写入 | 从5000条/秒降至2000条/秒 |
| 存储空间 | 从预期50GB增长到100GB+ |

尝试索引优化、分区表、SQL优化,效果有限。

原因分析

检测数据是典型时间序列数据------按时间写入、按时间查询、极少更新。PostgreSQL为通用事务场景设计,非为高频时序写入+范围查询优化。

选型对比

|-------------|------------|----------|
| 对比维度 | PostgreSQL | TDengine |
| 写入速度(条/秒) | 5000 | 30000+ |
| 7天趋势查询 | 15秒 | 200ms |
| 存储空间(500万条) | 100GB | 40GB |

TDengine核心优势:列式存储+时序索引,内置降采样和聚合函数,高压缩比。

迁移方案

渐进式迁移,降低风险:

  1. 历史数据(3个月以上)保留在PostgreSQL

  2. 新数据(7天内)写入TDengine

  3. 查询层做路由:7天内走TDengine,7天以上走PostgreSQL

代码示意:

public class DataQueryService {

public List<TrendData> queryTrend(Date start, Date end) {

long daysBetween = ChronoUnit.DAYS.between(start, end);

if (daysBetween <= 7) {

return tdEngineDao.queryTrend(start, end);

} else {

return pgDao.queryTrend(start, end);

}

}

}

踩坑提醒

⚠️ TDengine SQL语法与PostgreSQL有差异(如时间函数、分页语法),迁移时需逐一适配

⚠️ 分区键设计要合理,避免单表数据过大影响查询性能

⚠️ 历史数据迁移建议分批执行(每次10万条),避免一次性写入压力

⚠️ 应用层连接池需分别为TDengine和PostgreSQL独立配置

上线效果

  • 7天趋势查询:15秒 → 200ms(提升98.7%)

  • 存储空间:100GB → 40GB(减少60%)

  • 写入性能:2000条/秒 → 30000条/秒(提升15倍)

  • 管理层看板实时刷新,不再等报表

目前方案在汽车、锂电、光伏、医药都有落地案例。欢迎同行交流技术,也欢迎有需求的客户联系。

相关推荐
mldong1 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
小小猪的春天3 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
爱学堂IT分享4 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
王的宝库4 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
码事漫谈5 小时前
类型即世界:一个 C++ 程序员的本体论入门
后端
Rain的Java大神之路5 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
计算机毕设定制辅导-无忧学长6 小时前
《基于SpringBoot青年公寓出租管理系统的设计与实现》
java·vue.js·spring boot·青年公寓出租管理系统
MetaLite7 小时前
AI编程与工程底座-让AI遵守SpringBoot边界
人工智能·spring boot·ai编程
IT_陈寒7 小时前
Python的多线程居然是个假把式?搞清GIL让我少熬三天夜
前端·人工智能·后端
明月_清风7 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法