当前位置: 首页 > news >正文

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

    开发流程

    copy工程后注意变更点

    按需在[iotdb-mybatis-core]模块中的Modules包中新增所需时序数据实体操作;

      1. 新增枚举类型DataCategoryEnum,定义数据在iotdb中的设备时序前缀(库);
      1. 定义持久化信息实体,在需要入库的属性上加上@DataField注解;
        • 标识时序属性和数据类型
        • 实体必须包含createTime/createDate/acquisitionTime属性之一,用于框架记录时序时间
      1. 定义ORM相关Mapper类和xml文件,用于对象关系映射查询操作
      • Mapper类需继承IotDbBaseMapper<T, Q>
      • 最少包含queryPage、queryCount、queryCountList、delete基础方法实现
      1. 定义业务调用接口和Service实现类
      • Service实现类需继承AbstractIotDbUpdateService
      • 按需实现insert、queryAll、update、delete、insertBatch及自定义业务方法

    功能拓展说明

            当然,基于此方案结合半ORM框架,理论上能够实现非常多的功能支持,本文暂不提供其他内容说明及高级应用示例,请接和IOTDB官方文档sql部分,自行实现。

    工程开源参考:

    GitHub - endcy/fcwenergy-iotdb-mybatis: IoTDB结合Mybatis使用示例

    相关文章:

    IoTDB结合Mybatis使用示例(增删查改自定义sql等)

    IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…...

    skynet 源码阅读 -- 启动主流程

    Skynet 启动主流程分析 Skynet 是一个轻量级、高并发的服务器框架。它在启动时会进行一系列初始化操作&#xff0c;并启动多个不同功能的线程&#xff08;Monitor、Timer、Worker、Socket&#xff09;&#xff0c;从而实现消息分发、定时器、网络I/O等核心功能。本文主要从 ma…...

    OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯

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

    UDP 广播组播点播的区别及联系

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

    STM32补充——IAP

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

    Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南

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

    【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试

    本文目录 一、进程创建二、GDB多进程调试 一、进程创建 在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。 fork的作用就是创建一个子进程。 通过fork我们可以知道&#xff0c;创建子进程的时候&#xff0c;复制父进程的信息。 我们看看翻译的man文档信息&am…...

    C语言数组详解:从基础到进阶的全面解析

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

    docker的前世今生

    docker来自哪里&#xff1f; 从我们运维部署的历史来看&#xff0c;宿主机从最初的物理机到虚拟机&#xff0c;再到docker&#xff0c;一步步演进到现在。技术演进其实是为了解决当前技术的痛点&#xff0c;那我们来看看有哪些痛点以及如何克服痛点的。 物理机 一般来说&…...

    python实现施瓦茨-克里斯托费尔【全网首个】根据用户输入推测函数

    上代码&#xff1a; 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语言中的数组(上)

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

    Unity3D仿星露谷物语开发25之创建时钟界面

    1、目标 在时钟界面显示当前时钟信息&#xff0c;同时设置特殊按钮可以快速推进时间用于测试。 2、创建GameClock.cs脚本 在Assets -> Scripts -> TimeSystem目录下创建GameClock.cs脚本。 代码如下&#xff1a; using System.Collections; using System.Collections…...

    数据结构测试题1

    一、选择题: 1&#xff0e;若长度为n的钱性表采用顺序存储结构&#xff0c;删除它的第i数据元素之前&#xff0c;需要先依次向前移动( )个数据元素。( C ) A .n-i B.ni C.n-i-1 D.n-i1 2.在单链表中&#xff0c;已知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 通过模拟人类视觉认知过程&#xff0c;显著提升了区域级多模态识别能力。通过引入人眼的动态分辨率机制&#xff0c; 能够以同时完成区域识别、区域属性检测和区域字幕生成任务。 文章链…...

    Midjourney基础-常用修饰词+权重的用法大全

    用好修饰词很关键 Midjourney要用除了掌握好提示词的写法&#xff0c;按照上一篇《做Midjourney最好图文教程-提示词公式以及高级参数讲解》画面主体 场景氛围 主体行为 构图方式 艺术风格 图像质量。 要画出有质感的内容我们必须要掌握好“修饰词”&#xff0c;这些修饰…...

    没有屋檐的房子-023粪堆旁边的舞蹈

    爱美是天性&#xff0c;贫苦的农村人也一样&#xff0c;贫苦的时代也一样。 本世纪&#xff0c;广场舞在华夏大地遍地开花&#xff0c;甚至都传到了外面。但是广场舞这种舞蹈形式并不是互联网时代的特产&#xff0c;也不是电声设备日益高级和普及时代的特产&#xff0c;更不是大…...

    基于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…...

    【博客之星】年度总结:在云影与墨香中探寻成长的足迹

    &#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 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…...

    基于算法竞赛的c++编程(28)结构体的进阶应用

    结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

    Cursor实现用excel数据填充word模版的方法

    cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

    论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

    HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

    云计算——弹性云计算器(ECS)

    弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

    (十)学生端搭建

    本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

    【Linux】C语言执行shell指令

    在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

    关于nvm与node.js

    1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

    PL0语法,分析器实现!

    简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

    SpringCloudGateway 自定义局部过滤器

    场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

    Python 包管理器 uv 介绍

    Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...