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

这篇具有很好参考价值的文章主要介绍了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>

SpringBoot 整合 clickhouse和mysql 手把手教程全网最详细,java,sql,mysql,spring boot,clickhouse

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

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

数据源配置

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

3. 实体类

/**
 1. @author WXY
 2. @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 WXY
 4. @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 ag
        from 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 WXY
 * @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 WXY
 * @date 2022-07-01
 */
@Service
@DataSource(value = DataSourceType.SLAVE)
public class CurveServiceImpl implements ICurveService {

    private static final Logger log = LoggerFactory.getLogger(CurveServiceImpl.class);

    @Autowired
    private RedisCache redisCache;

    @Autowired
    private CurveMapper curveMapper;


    /**
     * 单条曲线使用
     * @param curve 【查询曲线】
     * @return
     */
    @Override
    public 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
     */
    @Override
    public 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 【查询曲线】集合
     */
    @Override
    public 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 {

    @Autowired
    private 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;
            //debug
            System.out.println("查询listCurveMany/" + time + "毫秒");
            return AjaxResult.success(list);
        }else {
            return AjaxResult.success("psn或者时间丢失");
        }
    }
}

晚点在写 没有用若依框架 怎么搭建主从数据库文章来源地址https://www.toymoban.com/news/detail-739268.html

到了这里,关于SpringBoot 整合 clickhouse和mysql 手把手教程全网最详细的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你Shiro整合JWT实现登录认证

    SpringBoot Mybatis-plus Shiro JWT Redis Shiro: Shiro 是一个基于 Java 的开源的安全框架。 在 Shiro 的核心架构里面,Subject 是访问系统的用户。SecurityManager 是安全管理器,负责用户的认证和授权,相当于 Shiro 的老大哥。 Realm 相当于数据源,用户的认证和授权都在 Realm 的方法中进行。

    2023年04月17日
    浏览(41)
  • 零基础手把手教你如何使用Laf免费玩转Midjourney后续之前端整合

    上篇讲述了 零基础手把手教你如何使用Laf免费玩转Midjourney,下面将讲解如何结合前端完成终极体验! 前端技术栈:vue + element plus 1.创建vue项目 这里使用vue脚手架创建项目,搭建项目步骤可参考官网  创建一个项目 | Vue CLI https://cli.vuejs.org/zh/guide/creating-a-project.html 2.安装el

    2024年02月09日
    浏览(31)
  • 手把手pip安装教程

    在Python中,pip是最常用的包管理工具之一。它可以用于安装、卸载和管理Python包。在本文中,我们将手把手教你如何安装pip,以便能够更方便地安装和管理Python包。 在安装pip之前,我们需要确认已经正确安装了Python,并确定其版本。在命令行中输入以下命令,确认Python版本:

    2024年02月11日
    浏览(52)
  • 手把手教你实现SpringBoot的监控!

    任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来说,监控都是必不可少的。 就目前而言,大部分微服务应用都是基于 SpringBoot 来构建,所以了解 SpringBoot 的监控特性是非

    2024年02月11日
    浏览(42)
  • 手把手教你从0搭建SpringBoot项目

    用到的工具:idea 2021、Maven 3.6.3、postman 框架:SpringBoot、Mybatis 数据库:Mysql8.0.30 安装配置参考博文 注意: 1.下载maven注意idea与Maven版本的适配: 2.为了避免每次创建项目都要改Maven配置,可以修改idea创建新项目的设置 二、安装数据库 mysql8安装参考博文 **注意:**连接不上往

    2024年02月03日
    浏览(37)
  • MYSQL安装手把手(亲测好用)

    (1)在公司官网:MySQL,点击图中蓝色选框的官网链接: (2)进入官网,点击DOWNLOADS (3)鼠标下拉,点击MySQL Community (GPL) Downloads (4)选择windows的版本,点击蓝色链接: (5)根据自己电脑的操作系统选择相应版本,分为32位和64位,也可以选择mysql的版本,我们这里选择最新版

    2024年02月11日
    浏览(37)
  • 手把手教你用 Jenkins 自动部署 SpringBoot

    CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。 CI/CD 的核心概念可以总结为三点: 持续集成 持续交付 持续部署 CI/CD 主要针对在集成新代码时所引发的问题(俗称\\\"集成地狱\\\")。 为什么会有集成地狱这个“雅称”呢?大家想想我们一个项目部署的

    2024年02月02日
    浏览(44)
  • 手把手教你彻底卸载MySQL

    ❤写在前面 ❤博客主页: 努力的小鳴人 ❤系列专栏: MySQL8.0基础学习 ❤欢迎小伙伴们, 点赞👍关注🔎收藏🍔 一起学习! ❤如有错误的地方,还请小伙伴们指正!🌹 ​ 目录 步骤1:停止MySQL服务 步骤2:软件的卸载 步骤3:残余文件的清理 步骤4:清理注册表 步骤5:删除

    2024年02月05日
    浏览(36)
  • vue项目打包部署-手把手教程

    1.购买服务器 可选阿里云/腾讯云/华为云 等等… 购买时选择镜像,我们这里以CentOS为例 2.配置服务器 2.1 安装FinalShell ​ 需要本地使用一些软件来操作服务器,例如:FinalShell / Xshell … ​ 我这里使用的是FinalShell,安装好以后,打开软件与建立链接,就可以用命令行来操作服务器了 最

    2024年02月22日
    浏览(48)
  • AI绘图Midjourney手把手教程

    以下是使用Midjourney AI绘画程序的注册和入门指南。Midjourney是一款功能强大的绘图软件,通过输入一段图片的文字描述即可生成精美的绘画。我们将为您提供详细的操作步骤,让您轻松上手。 下面是使用Midjourney AI绘画程序的指南: 1: 需要注册一个Discord账号,网址为https:/

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包