当前位置: 首页 > 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…...

    除了排错,你可能不知道OPC Expert v8.1还能做这些:数据归档、计算与冗余实战

    解锁OPC Expert v8.1的隐藏潜力&#xff1a;数据归档、实时计算与冗余架构实战指南在工业自动化领域&#xff0c;OPC Expert常被视为故障排查的"急救箱"&#xff0c;但它的能力远不止于此。当大多数工程师还在用它解决DCOM配置问题时&#xff0c;少数先行者已经用它重…...

    PDF 可视化签名盖章页技术解析

    本文是我在设备检测系统项目开发中,无设备检测的技术实现备忘录,记载实现过程。 本文以 PC 端页面 sign-pdf.vue 为主线,说明「无设备报检」在报告审批环节如何通过前后端协作,完成报告/记录 PDF 上的签名、印章、报告编号拖放定位,并在审批通过后由后端合并生成带签章的正…...

    VMware ESXi 9.1.0.0集成NVME+网卡驱动版发布|新特性+驱动集成+部署升级+FAQ全指南

    一、ESXi 9.1.0.0 正式版核心新特性 VMware ESXi 9.1.0.0&#xff08;2026 年 5 月发布&#xff09;是 vSphere 9.1 核心组件&#xff0c;聚焦硬件兼容扩展、性能跃升、安全加固、运维简化四大方向&#xff0c;重点强化 NVMe 存储与网卡生态适配&#xff0c;以下为关键更新&am…...

    智能体所有权与版权:AI Agent Harness Engineering 创造的作品归谁所有?

    1. 标题选项 《AI Agent创作版权迷局破解:从Harness工程原理到所有权划分的完整指南》 《智能体作品归谁?AI Agent Harness Engineering场景下的版权规则深度拆解》 《告别权属纠纷:一文搞懂AI Agent生成内容的所有权、版权与收益分配规则》 《Harness工程视角下的AI创作权:…...

    SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能

    SMUDebugTool终极指南&#xff1a;如何深度掌控AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

    电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案

    在2026年的电信行业&#xff0c;海量工单处理已不再仅仅是效率问题&#xff0c;而是合规与生存的底线。随着2026年5月20日《电信和互联网服务 基础电信企业网上营业厅服务规范》国家标准的正式实施&#xff0c;监管层对“信息透明、流程闭环、计费精准”的要求达到了前所未有的…...

    Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路

    Python UiAutomation实战&#xff1a;打通数据采集全链路的智能解决方案 在数据驱动的商业环境中&#xff0c;企业常常面临跨平台数据采集的挑战——财务系统里的交易记录需要与网站后台的报表进行交叉分析&#xff0c;销售数据要从桌面软件导出后上传到云端处理系统。传统的人…...

    Web渗透测试能力成长地图:从工具使用到漏洞认知跃迁

    1. 这不是工具清单&#xff0c;而是一张Web渗透测试的“能力成长地图”你刚点开这篇文章&#xff0c;大概率正站在两个路口之间&#xff1a;一边是网上铺天盖地的“十大免费扫描器推荐”&#xff0c;点进去全是截图下载链接一句“一键扫漏洞”&#xff0c;结果装完跑两下&#…...

    基于MAX78000的医疗紧急呼叫系统:边缘AI与低功耗设计实战

    1. 项目概述与核心价值大家好&#xff0c;我是Victor Hugo&#xff0c;一名电子工程师。今天我想和大家分享一个我最近完成并参与设计竞赛的项目&#xff1a;一个基于MAX78000 FTHR开发板的医疗紧急呼叫辅助系统。这个项目的核心&#xff0c;不是从零开始造一个新轮子&#xff…...

    WarcraftHelper终极指南:魔兽争霸3兼容性问题一站式解决方案

    WarcraftHelper终极指南&#xff1a;魔兽争霸3兼容性问题一站式解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》在现代电…...