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

    VTK如何让部分单位不可见

    最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

    令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

    文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

    智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

    在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

    springboot整合VUE之在线教育管理系统简介

    可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

    算法:模拟

    1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

    【Go语言基础【12】】指针:声明、取地址、解引用

    文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

    接口自动化测试:HttpRunner基础

    相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

    [大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

    ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

    基于PHP的连锁酒店管理系统

    有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

    STM32---外部32.768K晶振(LSE)无法起振问题

    晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...