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

SpringBoot 整合 clickhouse和mysql 手把手教程全网最详细

最近做一个项目 需要 整合mysql clickhouse 多数据源

后台用的是ruoyi框架

1. 首先pom引入相关依赖

  <!--JDBC-clickhouse数据库--><dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.2</version>	<!-- 0.2.4/0.2.5/0.2.6/0.3.0/0.3.2 --></dependency>

在这里插入图片描述

2. 编写配置文件 application.yml(properties同理)

需要注意的是官网不建议使用ru.yandex.clickhouse驱动,应该改成com.clickhouse驱动,并且推荐使用0.3.2以上的版本

数据源配置

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:# 主库数据源  mysqlmaster:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: 123456# 从库数据源   clickhouseslave:# 从数据源开关/默认关闭driverClassName: com.clickhouse.jdbc.ClickHouseDriverenabled: trueurl: jdbc:clickhouse://localhost:8123/testusername: adminpassword: 123456# 初始连接数initialSize: 10# 最小连接池数量minIdle: 15# 最大连接池数量maxActive: 50# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1testWhileIdle: truetestOnBorrow: falsetestOnReturn: false

3. 实体类

/**1. @author WXY2. @date 2023/2/24 14:46*/
public class Curve {/** 设备sn */private  String sn;/** 属性sn */private  String psn;/** 属性id */private  Integer pid;/** 值 */private Float val;/** 时间 */@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date time;/** 开始时间 */private String startDateTime;/** 结束时间 */private String  endDateTime;/** 设备名称 */private String  name;/*** 表时间*/private String outsideTime;public String getOutsideTime() {return outsideTime;}public void setOutsideTime(String outsideTime) {this.outsideTime = outsideTime;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSn() {return sn;}public void setSn(String sn) {this.sn = sn;}public String getPsn() {return psn;}public void setPsn(String psn) {this.psn = psn;}public Integer getPid() {return pid;}public void setPid(Integer pid) {this.pid = pid;}public Float getVal() {return val;}public void setVal(Float val) {this.val = val;}public Date getTime() {return time;}public void setTime(Date time) {this.time = time;}public String getStartDateTime() {return startDateTime;}public void setStartDateTime(String startDateTime) {this.startDateTime = startDateTime;}public String getEndDateTime() {return endDateTime;}public void setEndDateTime(String endDateTime) {this.endDateTime = endDateTime;}
}

4. mapper接口

/**1. 【查询clickhouse】Mapper接口2. 3. @author gjwl4. @date 2023-02-24*/
public interface CurveMapper {/*** 查询【单个曲线】列表** @param curve 【曲线】  秒级数据* @return 【请填写功能名称】集合*/public List<CurveVo> selectCurveVoList(Curve curve);/*** 查询单个集合里面最大最小平均值** @param curve 【曲线】* @return 【查询单个集合里面最大最小平均值】集合*/public Map selectMinAdnMax(Curve curve);
}

5. mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xx.xx.mapper.CurveMapper"><!--正常实体--><resultMap type="Curve" id="CurveResult"><result property="sn"    column="sn"    /><result property="psn"    column="psn"    /><result property="pid"    column="pid"    /><result property="val"    column="val"    /><result property="time"    column="time"    /></resultMap><sql id="selectCurveVo">select val,time from curve</sql><!--用于单条曲线--><select id="selectCurveVoList" parameterType="Curve" resultMap="CurveVoResult"><include refid="selectCurveVo"/><where><if test="psn != null  and psn != ''"> and psn = #{psn}</if><if test="startDateTime != null "> and time &gt;= #{startDateTime}</if><if test="endDateTime != null "> and time &lt;=  #{endDateTime}</if></where>order by time asc</select><!--拿最大最小平均值--><select id="selectMinAdnMax" parameterType="Curve" resultType="Map">select max(val) as big, min(val) as small, round(avg(val),1) as agfrom curve<where><if test="psn != null  and psn != ''"> and psn = #{psn}</if><if test="startDateTime != null "> and time &gt;= #{startDateTime}</if><if test="endDateTime != null "> and time &lt;=  #{endDateTime}</if></where></select></mapper>

6. service类

/*** 【查询曲线】Service接口* * @author gjwl* @date 2022-07-01*/
public interface ICurveService {/*** 查询【查询曲线】列表  单条返回** @param curve 【查询曲线】* @return 【查询曲线】集合*/public List<CurveVo> selectCurveVoList(Curve curve);/*** 查询【查询曲线】列表  多条返回* 分钟级别** @param curve 【查询曲线】* @return 【查询曲线】集合*/public List<CurveManyVo> selectCurveManyVoList(Curve curve);/*** 查询【查询曲线】列表  单条返回* 带最大最小值** @param curve 【查询曲线】* @return 【查询曲线】集合*/public Map selectMinAdnMax(Curve curve);}

7. ServiceImpl类

重点在@DataSource(value = DataSourceType.SLAVE) 注解上 在这里切换从库代表这个类里面的方法都切换成从库的数据库

/*** 【查询曲线】Service业务层处理*  * @author gjwl* @date 2022-07-01*/
@Service
@DataSource(value = DataSourceType.SLAVE)
public class CurveServiceImpl implements ICurveService {private static final Logger log = LoggerFactory.getLogger(CurveServiceImpl.class);@Autowiredprivate RedisCache redisCache;@Autowiredprivate CurveMapper curveMapper;/*** 单条曲线使用* @param curve 【查询曲线】* @return*/@Overridepublic List<CurveVo> selectCurveVoList(Curve curve) {String key = getCacheDsnKey(Constants.curve, curve.getPsn(), curve.getStartDateTime(), curve.getEndDateTime());List<CurveVo> list = curveMapper.selectCurveVoList(curve);if (list.size() > 0) {redisCache.setCacheList(key, list);//使用 删除缓存redisCache.expire(key, 2, TimeUnit.MINUTES);}return list;}/*** 单条曲线使用* @param curve 【查询曲线】*  最大值最小值平均值* @return*/@Overridepublic Map selectMinAdnMax(Curve curve) {String key = getCacheDsnKey(Constants.curve, curve.getPsn(), curve.getStartDateTime(), curve.getEndDateTime());Map mapList = new HashMap();//查询曲线List<CurveVo> list = curveMapper.selectCurveVoList(curve);//查询最大最小平均值Map maps = curveMapper.selectMinAdnMax(curve);mapList.put("list",list);mapList.put("min",maps.get("small"));mapList.put("max",maps.get("big"));mapList.put("average",maps.get("ag"));if (list.size() > 0) {redisCache.setCacheMap(key, mapList);//使用 删除缓存redisCache.expire(key, 2, TimeUnit.MINUTES);}return mapList;}/*** 查询【查询曲线】列表  多条返回* 分钟级别** @param curve 【查询曲线】* @return 【查询曲线】集合*/@Overridepublic List<CurveManyVo> selectCurveManyVoList(Curve curve) {String[] items = curve.getPsn().split(",");List<CurveManyVo> curveManyVos = new ArrayList<>();CurveManyVo curveManyVo ;for (String s :items){curve.setPsn(s);curveManyVo = new CurveManyVo();curveManyVo.setCurveVos(curveMapper.selectCurveVoList(curve));curveManyVo.setPsn(s);curveManyVos.add(curveManyVo);}return curveManyVos;}/*** 设置cache key** @param configKey 参数键* @return 缓存键key*/private String getCacheDsnKey(String configKey, String psn, String startDateTime, String endDateTime) {return configKey + psn + startDateTime.replaceAll(":", "_") + "_" + endDateTime.replaceAll(":", "_");}}

8. Controller类

/*** @author WXY* @date 2023/2/24 15:28*/
@RestController
@RequestMapping("/xx/curvemessage")
public class CurveController extends BaseController {@Autowiredprivate ICurveService iCurveService;/*** 查询单条【曲线日志】列表  按秒级 来查询* 需要查询出来 最大值最小值 还有平均值*/@GetMapping("/listMinMax")public AjaxResult listMinMax(Curve curve) {curve.setTable(TABLE + curve.getOutsideTime());if (StringUtils.isNotEmpty(curve.getPsn())&&StringUtils.isNotEmpty(curve.getStartDateTime())&&StringUtils.isNotEmpty(curve.getEndDateTime())){//查询之后缓存  缓存5分钟  当再次请求此接口在替换掉缓存的值  方便下载功能Map list = iCurveService.selectMinAdnMax(curve);return AjaxResult.success(list);}else {return AjaxResult.success("psn或者时间丢失");}}/*** 查询单条【曲线日志】列表  按秒级 来查询* 没有最大最小值和平均值*/@GetMapping("/list")public AjaxResult list(Curve curve) {curve.setTable(TABLE + curve.getOutsideTime());if (StringUtils.isNotEmpty(curve.getPsn())&&StringUtils.isNotEmpty(curve.getStartDateTime())&&StringUtils.isNotEmpty(curve.getEndDateTime())){//查询之后缓存  缓存5分钟  当再次请求此接口在替换掉缓存的值  方便下载功能List<CurveVo> list = iCurveService.selectCurveVoList(curve);return AjaxResult.success(list);}else {return AjaxResult.success("psn或者时间丢失");}}/*** 查询多条【曲线日志】列表*/@GetMapping("/listCurveMany")public AjaxResult listCurveMany(Curve curve) {Long start = System.currentTimeMillis();if (StringUtils.isNotEmpty(curve.getPsn())&&StringUtils.isNotEmpty(curve.getStartDateTime())&&StringUtils.isNotEmpty(curve.getEndDateTime())){curve.setTable(TABLE + curve.getOutsideTime());List<CurveManyVo> list = iCurveService.selectCurveManyVoList(curve);Long end = System.currentTimeMillis();long time = end - start;//debugSystem.out.println("查询listCurveMany/" + time + "毫秒");return AjaxResult.success(list);}else {return AjaxResult.success("psn或者时间丢失");}}
}

晚点在写 没有用若依框架 怎么搭建主从数据库

相关文章:

SpringBoot 整合 clickhouse和mysql 手把手教程全网最详细

最近做一个项目 需要 整合mysql clickhouse 多数据源 后台用的是ruoyi框架 1. 首先pom引入相关依赖 <!--JDBC-clickhouse数据库--><dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version&…...

Leetcode-java 数据结构回顾 Day01

数据结构复习 虽说是复习&#xff0c;但是都差不多忘干净了。而且用c做题做的多。 借从Leetcode上做题的机会&#xff0c;记一记自己之前学过的java知识。 链表 数组好歹写个动态规划&#xff0c;还能对六七十个样例&#xff0c;链表是一点头绪都没&#xff0c;尤其是要写头…...

Java spring cloud 企业工程管理系统源码+项目模块功能清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

用Biome-BGC模型如何模拟水循环过程

在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天的初级生产力(GPP)&#xff0c;将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库&#xff1b;对于水份输运过程…...

【目标检测论文解读复现NO.33】改进YOLOv5的新能源电池集流盘缺陷检测方法

前言此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;…...

二进制转换之命理学习

什么是十神 运用儒家学说&#xff1a; 克我者官也&#xff1a;古代没有民主思想&#xff0c;官不是为民服务的&#xff0c;官就是克的。 对男命来说克我的是儿女&#xff0c;女儿是正官&#xff0c;儿子是偏官&#xff08;七杀&#xff09;克的厉害&#xff0c;对父亲来说有了…...

es6 常见规范

块级作用域 &#xff08;1&#xff09;let 取代 var ES6提出了两个新的声明变量的命令&#xff1a;let和const。其中&#xff0c;let完全可以取代var&#xff0c;因为两者语义相同&#xff0c;而且let没有副作用。 use strict;if (true) {let x hello; }for (let i 0; i &…...

大学计算机基础填空题

大学计算机填空题 1、 从计算机域名到 IP地址的翻译过程称为域名解析。 2、计算机各部件传递信息的通道称为总线英文是BUS。 3、 采用 ASCII 编码时每个字符占1个字节&#xff0c;最高为是0。 4、 电子计算机的特点有&#xff1a;速度快、精度高、存储容量大、具有逻辑判断能力…...

低代码开发平台是什么意思?低代码开发平台优势!

大多数企业都在寻求尽可能地改善客户体验。因此&#xff0c;企业和开发人员正在转向低代码开发平台&#xff0c;以在没有传统方法的情况下提供有针对性的应用程序。关键是尽可能消除手动编程过程。 低代码开发平台是什么意思&#xff1f; 低代码是开发应用程序的现代方式。它…...

CSAPP - Bomb Lab

介绍&#xff1a;http://csapp.cs.cmu.edu/3e/bomblab.pdf 工具&#xff1a;gdb gdb手册&#xff1a;http://csapp.cs.cmu.edu/2e/docs/gdbnotes-x86-64.pdf phase_1 反汇编phase_1函数。 (gdb) disas phase_1 Dump of assembler code for function phase_1:0x00000000004…...

Docker 常见操作及部署springboot、Shiro、SpringData脚手架(下)

1、查找jdk容器 docker search jdk 2、查看镜像 docker images 3、启动JDK镜像 docker run -di --namejdk1.8 clarinpl/java 4、查看镜像运行情况 docker ps 5、使用命令行进入容器 docker exec -it 48428f21b6ee /bin/bash 6、查看jdk版本 java -version 7、从宿主机复制…...

【前端学习】D3:CSS进阶

文章目录前言系列文章目录1 CSS的三大特性1.1 层叠性1.2 继承性1.3 优先级&#xff08;*&#xff09;2 盒子模型2.1 看透网页布局的本质2.2 盒子模型&#xff08;Box Model&#xff09;的组成2.3 边框&#xff08;border&#xff09;2.3.1 普通边框2.3.2 表格的细线边框2.3.3 边…...

中移杭研面试经历

文章目录 mysql 事务隔离级别mongo查询数据不到,但是导出来后有这条数据,为什么呢?排查过程cms 和 g1区别使用范围不一样STW的时间垃圾碎片垃圾回收的过程不一样CMS会产生浮动垃圾,G1没有浮动垃圾G1回收器的特点大对象的处理CMS的总结和优缺点cms 回收算法STW发生在哪些阶段…...

[CV学习笔记] yolotensorrt多线程推理-第一部分

1、前言 之前分享了利用FastDet&tensorrt多线程推理的代码&#xff0c;本想着继续学习yolo&tensorrt多线程的代码&#xff0c;但是现在shouxieai直接开源的该项目&#xff0c;而且还包含yolov8实例分割的代码。因此本文主要是对项目代码进行梳理&#xff0c;一方面加深…...

element ui 的滚动条,Element UI 文档中没有被提到的滚动条

element ui 的滚动条,Element UI 文档中被提到的滚动条 Element UI 官网中有用到自定义的滚动条组件&#xff0c;但是发布的所有版本中都不曾提及&#xff0c;个中原因我们不得而知&#xff0c;不过我们还是可以拿过来引用到自己的项目中。 使用的时候&#xff0c; 放在 <el…...

项目四:使用路由交换机构建园区网-任务三:配置路由交换机并进行通信测试

配置路由交换机并通信测试1、在RS-1上创建VLAN并配置Trunk接口2、测试通信结果3、配置RS-1的三层路由接口&#xff08;SVI&#xff09;1、在RS-1上创建VLAN并配置Trunk接口 进入系统视图&#xff0c;关闭信息中心&#xff0c;重命名为RS-1 system-view undo info-center enab…...

数据仓库面试题汇总

一、分析 1&#xff0e;什么是逻辑数据映射&#xff1f;它对 ETL 项目组的作用是什么&#xff1f; 逻辑数据映射&#xff08;Logical Data Map&#xff09;用来描述源系统的数据定义、目标数据仓库的模型以及 将源系统的数据转换到数据仓库中需要做操作和处理方式的说明文档&…...

【Redis】哨兵机制(三)

目录 3.Redis哨兵 3.1.哨兵原理 3.1.1.集群结构和作用 3.1.2.集群监控原理 3.1.3.集群故障恢复原理 3.1.4.小结 3.2.搭建哨兵集群 3.3.RedisTemplate 3.3.1.导入Demo工程 3.3.2.引入依赖 3.3.3.配置Redis地址 3.3.4.配置读写分离 3.Redis哨兵 Redis提供了哨兵&am…...

好用的电脑录屏工具有哪些?电脑好用的录屏工具

现如今很多人都渐渐对录屏有了需求&#xff0c;尤其是网课老师和网络主播的从业者&#xff0c;录屏工具可以帮助他们减轻很多工作量。好用的电脑录屏工具有哪些&#xff1f; 平时在工作学习中&#xff0c;我们往往会有录制视频的需求&#xff0c;比如录制游戏视频、录制网课视频…...

Ubuntu20.04部署安装Kubernetes1.23<最新尝试,无坑版>

文章目录安装部署过程1.修改基本配置2.安装docker3.安装k8s4.kubeadm建立集群5.安装网络插件6.部署dashboard节点安排&#xff1a;nameIPmaster172.16.10.21node1172.16.10.22node2172.16.10.23 如果接下来的步骤中没有特殊指明是哪台机器要做的话&#xff0c;就都要执行 安装…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...