IoTDB结合Mybatis使用示例(增删查改自定义sql等)
IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,iotdb时序库虽然有官方文档的支持,以及一套SQL方案,但基于语言特性或者我们开发习惯,我们往往需要单独写一套方案来做接入支持。
这里介绍了一套完整的Springboot(Spring Cloud)应用接入iotdb的方案支持,能够想关系型数据库一样,将对象作为一个时序模板,管理时序库数据。当然不尽完美,但应对简单的增删查改,基本满足使用要求。下面直接介绍开源内容。
线上效果说明:当前 单设备 时序元数据量(可以简单理解为表对象的行数据)达到了千万级,亿级测点累计,近七千设备量,总数据量近1TB,查询耗时依旧是毫秒响应返回。
github地址:
GitHub - endcy/fcwenergy-iotdb-mybatis: IoTDB结合Mybatis使用示例
架构说明
- 使用iotdb官方包的iotdb-session完成数据的新增,因为使用sql插入,性能太差了,使用官方session包实测每秒基础服单机配置可插入近五万条时序模板数据(开发机配置i5/16G/SSD);
- 数据查询参考官方sql方式,支持面向对象方式的传入查询条件
- 数据update即使用原有时序时间戳,修改实体数据后重新插入,覆盖原有时序;
- 使用官方支持的delete删除数据;
- 自定义注解类型处理器,实现ORM的优势。
工程特性
- IoTDB接入Mybatis,定义时序对象、ORM配置后即可使用,低学习成本,易用易拓展;
- 不需要过于复杂的JDBC/ORM-XML的编码即可执行自定义数据对象的读写操作;
- 支持官方工具包JDBC操作,补充ORM难于实现的更新操作,支持高效api批量插入;
- 动态管理设备时序属性,无需先新增属性再执行入库操作,直接操作数据;
- 方便工程拓展,使用装饰器实现需要的其他备选库持久化操作,如MYSQL等;
- 针对不便处理的时序路径、数据类型等,使用工程自定义的执行器完成相关逻辑;
- 注解简化处理字符串参数类型查询匹配
- iotdb异步数据备份,历史数据DTS服务
- 接口集成测试,方便快速测试
工程结构
- iotdb-mybatis-core 核心工程模块,包含session的时序插入和mybatis集成的查询DML操作
- common-domain 领域模型,包含时序数据实体及其他公共参数相关实体
- iotdb-history-dts 历史数据DTS服务
- application-demo 示例应用工程,包含时序数据实体查询新增触发等操作,集成测试接口验证等
部署准备
- iotdb部署
- 支持docker或jar运行部署
- 推荐官方文档集群部署方案
- 加入iotdb-mybatis-coreiotdb-mybatis-core工程
- 工程作为module嵌入到目标应用工程
- 根据#开发流程自定义需要的时序数据逻辑
测试验证(示例)
-
完善数据库连接和应用配置,运行Application
-
接口http://localhost:8060/logKw/random/add?equipmentId=1001 新增时序实体数据
-
接口http://localhost:8060/logKw/list/days?equipmentId=1001&days=7 查询数据
-
接口http://localhost:8060/logKw/dts/logKw?equipmentId=1001&days=7 dts历史数据同步
配置信息
- 配置中增加多数据源依赖
- #iotdb配置,根据配置和实际部署,自定义参数
- spring.datasource.iotdb.username = 用户名
- spring.datasource.iotdb.password = 密码
- spring.datasource.iotdb.host = ip
- spring.datasource.iotdb.port = 6667(或设定的端口)
- spring.datasource.iotdb.driver-class-name = org.apache.iotdb.jdbc.IoTDBDriver
- spring.datasource.iotdb.jdbc-url = jdbc:iotdb://${spring.datasource.iotdb.host}:${spring.datasource.iotdb.port}/
- spring.datasource.iotdb.initial-size = 5
- spring.datasource.iotdb.min-idle = 10
- spring.datasource.iotdb.max-active = 50
- spring.datasource.iotdb.max-wait = 60000
- spring.datasource.iotdb.remove-abandoned = true
- spring.datasource.iotdb.remove-abandoned-timeout = 30
- spring.datasource.iotdb.time-between-eviction-runs-millis = 60000
- spring.datasource.iotdb.min-evictable-idle-time-millis = 300000
- spring.datasource.iotdb.test-while-idle = false
- spring.datasource.iotdb.test-on-borrow = false
- spring.datasource.iotdb.test-on-return = false
- spring.datasource.iotdb.druid.pool-prepared-statements = true
- #iotdb配置,根据配置和实际部署,自定义参数
开发流程
copy工程后注意变更点
按需在[iotdb-mybatis-core]模块中的Modules包中新增所需时序数据实体操作;
-
- 新增枚举类型DataCategoryEnum,定义数据在iotdb中的设备时序前缀(库);
-
- 定义持久化信息实体,在需要入库的属性上加上@DataField注解;
- 标识时序属性和数据类型
- 实体必须包含createTime/createDate/acquisitionTime属性之一,用于框架记录时序时间
- 定义持久化信息实体,在需要入库的属性上加上@DataField注解;
-
- 定义ORM相关Mapper类和xml文件,用于对象关系映射查询操作
- Mapper类需继承IotDbBaseMapper<T, Q>
- 最少包含queryPage、queryCount、queryCountList、delete基础方法实现
-
- 定义业务调用接口和Service实现类
- Service实现类需继承AbstractIotDbUpdateService
- 按需实现insert、queryAll、update、delete、insertBatch及自定义业务方法
功能拓展说明
当然,基于此方案结合半ORM框架,理论上能够实现非常多的功能支持,本文暂不提供其他内容说明及高级应用示例,请接和IOTDB官方文档sql部分,自行实现。
工程开源参考:
GitHub - endcy/fcwenergy-iotdb-mybatis: IoTDB结合Mybatis使用示例
相关文章:

IoTDB结合Mybatis使用示例(增删查改自定义sql等)
IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,…...
skynet 源码阅读 -- 启动主流程
Skynet 启动主流程分析 Skynet 是一个轻量级、高并发的服务器框架。它在启动时会进行一系列初始化操作,并启动多个不同功能的线程(Monitor、Timer、Worker、Socket),从而实现消息分发、定时器、网络I/O等核心功能。本文主要从 ma…...

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯
目录 简述 什么是高通滤波? 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV:图像滤波、卷积与卷积核…...

UDP 广播组播点播的区别及联系
1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...

STM32补充——IAP
0 前置知识: FLASH相关内容:前往STM32补充——FLASH STM32三种烧录方式(看看就行): 1.ISP:In System Programming(在系统编程) 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...

Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南
由于 Jetson 为 ARM64 (aarch64) 的系统架构,所以不能用 pip install 直接安装,需要通过源码编译。 升级系统 JetPack 由于 Open3D-ML 目前只支持 CUDA 10.0 以及 CUDA 11.*,并且 JetPack 的 CUDA 开发环境只有10.2、11.4以及12.2࿰…...

【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试
本文目录 一、进程创建二、GDB多进程调试 一、进程创建 在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。 fork的作用就是创建一个子进程。 通过fork我们可以知道,创建子进程的时候,复制父进程的信息。 我们看看翻译的man文档信息&am…...

C语言数组详解:从基础到进阶的全面解析
在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中,…...

docker的前世今生
docker来自哪里? 从我们运维部署的历史来看,宿主机从最初的物理机到虚拟机,再到docker,一步步演进到现在。技术演进其实是为了解决当前技术的痛点,那我们来看看有哪些痛点以及如何克服痛点的。 物理机 一般来说&…...
python实现施瓦茨-克里斯托费尔【全网首个】根据用户输入推测函数
上代码: from sympy import symbols, integrate, simplify from sympy.plotting import plotn int(input("n:")) if n < 2:print("Error: Must n > 2") i 0 a [] aef [] A [] x, y symbols(x y) z, w symbols(z w)while i < n…...

c语言中的数组(上)
数组的概念 数组是⼀组相同类型元素的集合; 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。 数组中存放的多个数据,类型是相同的。 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…...

Unity3D仿星露谷物语开发25之创建时钟界面
1、目标 在时钟界面显示当前时钟信息,同时设置特殊按钮可以快速推进时间用于测试。 2、创建GameClock.cs脚本 在Assets -> Scripts -> TimeSystem目录下创建GameClock.cs脚本。 代码如下: using System.Collections; using System.Collections…...

数据结构测试题1
一、选择题: 1.若长度为n的钱性表采用顺序存储结构,删除它的第i数据元素之前,需要先依次向前移动( )个数据元素。( C ) A .n-i B.ni C.n-i-1 D.n-i1 2.在单链表中,已知q指的结点是p指的结点的直接前驱结点&am…...
android wifi AsyncChannel(WifiManager和WifiP2pManager)
AynscChannel的讲解 [Android]AsyncChannel介绍-CSDN博客 WifiP2pManager里的channel的使用理解 WifiP2pManager.java public void createGroup(Channel c, ActionListener listener) {checkChannel(c);c.mAsyncChannel.sendMessage(CREATE_GROUP, WifiP2pGroup.NETWORK_ID_PE…...

【Image Captioning】DynRefer
DynRefer是由中国科学院大学于2024年提出的用于1种用于区域级多模态任务的模型。DynRefer 通过模拟人类视觉认知过程,显著提升了区域级多模态识别能力。通过引入人眼的动态分辨率机制, 能够以同时完成区域识别、区域属性检测和区域字幕生成任务。 文章链…...

Midjourney基础-常用修饰词+权重的用法大全
用好修饰词很关键 Midjourney要用除了掌握好提示词的写法,按照上一篇《做Midjourney最好图文教程-提示词公式以及高级参数讲解》画面主体 场景氛围 主体行为 构图方式 艺术风格 图像质量。 要画出有质感的内容我们必须要掌握好“修饰词”,这些修饰…...
没有屋檐的房子-023粪堆旁边的舞蹈
爱美是天性,贫苦的农村人也一样,贫苦的时代也一样。 本世纪,广场舞在华夏大地遍地开花,甚至都传到了外面。但是广场舞这种舞蹈形式并不是互联网时代的特产,也不是电声设备日益高级和普及时代的特产,更不是大…...

基于Docker的Kafka分布式集群
目录 1. 说明 2. 服务器规划 3. docker-compose文件 kafka{i}.yaml kafka-ui.yaml 4. kafka-ui配置集群监控 5. 参数表 6. 测试脚本 生产者-异步生产: AsyncKafkaProducer1.py 消费者-异步消费: AsyncKafkaConsumer1.py 7. 参考 1. 说明 创建一个本地开发环境所需的k…...

【博客之星】年度总结:在云影与墨香中探寻成长的足迹
🐇明明跟你说过:个人主页 🔖行路有良友,便是天堂🔖 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…...

SpringBoot的Swagger配置
一、Swagger配置 1.添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version> </dependency> 2.修改WebMvcConfig Slf4j Configurat…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
【Redis】Redis从入门到实战:全面指南
Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...

第2篇:BLE 广播与扫描机制详解
本文是《BLE 协议从入门到专家》专栏第二篇,专注于解析 BLE 广播(Advertising)与扫描(Scanning)机制。我们将从协议层结构、广播包格式、设备发现流程、控制器行为、开发者 API、广播冲突与多设备调度等方面,全面拆解这一 BLE 最基础也是最关键的通信机制。 一、什么是 B…...