SpringBoot2如何实现与ClickHouse数据库的深度整合?

2026-05-29 09:403阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1282个文字,预计阅读时间需要6分钟。

SpringBoot2如何实现与ClickHouse数据库的深度整合?

1. ClickHouse 简介

1.1 什么是ClickHouse?

Yandex开源的数据分析数据库,名为ClickHouse。适用于流式或批量入库的顺序数据。

ClickHouse不适宜用作通用数据库,而是作为超高性能的海量数据处理平台。

1 ClickHouse简介

1.1 什么是ClickHouse?

Yandex开源的数据分析的数据库,名字叫做ClickHouse,适合流式或批次入库的时序数据。ClickHouse不应该被用作通用数据库,而是作为超高性能的海量数据快速查询的分布式实时处理平台,在数据汇总查询方面(如GROUP BY),ClickHouse的查询速度非常快。

1.2 在哪里可以找到ClickHouse

ClickHouse 是一个真正的用于联机分析(OLAP)列式数据库管理系统(DBMS)。始终按列存储,包括矢量执行过程,有利于降低实际的数据处理开销。


ClickHouse官网地址,请参见:​​clickhouse.yandex/​​​

ClickHouse中文文档链接,请参见:​​clickhouse.yandex/docs/zh/​​ 和 ​​clickhouse.tech/docs/zh/development/architecture/​​

ClickHouse代码GitHub,请参见:​​github.com/ClickHouse/ClickHouse​​

1.3 ClickHouse支持的场景

  • 绝大多数是读请求
  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
  • 已添加到数据库的数据不能修改。
  • 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
  • 宽表,即每个表包含着大量的列
  • 查询相对较少(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每个查询有一个大表。除了他以外,其他的都很小。
  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中

1.4 数据存储

  • 列式数据存储
  • 行式数据
  • 列式数据
  • 对比分析

2 整合到SpringBoot

该案例基于:Druid连接池和mybatis进行整合。Druid 1.1.10 版本 SQL Parser对clickhouse的开始提供支持。

SpringBoot2如何实现与ClickHouse数据库的深度整合?

2.1 创建SpringBoot的Maven项目

首先创建一个模版项目,然后增加maven依赖以及SpringBoot基础依赖。

2.2 Maven依赖

第一步先从maven或者其他仓库,找到依赖,配置到pom.xml文件中。

……
<!-- Clickhouse-JDBC -->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2</version>
</dependency>

<!-- Druid Pool -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.12</version>
</dependency>

<!-- MhyBatis -->
<!-- mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>

<!-- Spring框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.6.6</version>
</dependency>


<!-- 工具类 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
……

2.3 配属数据源

在application.yml配置文件中配置数据源。

spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
click:
driverClassName: ru.yandex.clickhouse.ClickHouseDriver
url: jdbc:clickhouse://127.0.0.1:8123/default
initialSize: 10
maxActive: 100
minIdle: 10
maxWait: 6000

2.4 Druid连接池配置

@Configuration
public class DruidConfig {
@Resource
private JdbcParamConfig jdbcParamConfig ;
@Bean
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(jdbcParamConfig.getUrl());
datasource.setDriverClassName(jdbcParamConfig.getDriverClassName());
datasource.setInitialSize(jdbcParamConfig.getInitialSize());
datasource.setMinIdle(jdbcParamConfig.getMinIdle());
datasource.setMaxActive(jdbcParamConfig.getMaxActive());
datasource.setMaxWait(jdbcParamConfig.getMaxWait());
return datasource;
}
}

2.5 数据库连接参数配置类

@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.click")
public class JdbcParamConfig {

private String driverClassName;
private String url;
private Integer initialSize;
private Integer maxActive;
private Integer minIdle;
private Integer maxWait;

}

3 结合MyBatis实际开发使用

结合MyBatis同其他使用MyBatis一致。

本文共计1282个文字,预计阅读时间需要6分钟。

SpringBoot2如何实现与ClickHouse数据库的深度整合?

1. ClickHouse 简介

1.1 什么是ClickHouse?

Yandex开源的数据分析数据库,名为ClickHouse。适用于流式或批量入库的顺序数据。

ClickHouse不适宜用作通用数据库,而是作为超高性能的海量数据处理平台。

1 ClickHouse简介

1.1 什么是ClickHouse?

Yandex开源的数据分析的数据库,名字叫做ClickHouse,适合流式或批次入库的时序数据。ClickHouse不应该被用作通用数据库,而是作为超高性能的海量数据快速查询的分布式实时处理平台,在数据汇总查询方面(如GROUP BY),ClickHouse的查询速度非常快。

1.2 在哪里可以找到ClickHouse

ClickHouse 是一个真正的用于联机分析(OLAP)列式数据库管理系统(DBMS)。始终按列存储,包括矢量执行过程,有利于降低实际的数据处理开销。


ClickHouse官网地址,请参见:​​clickhouse.yandex/​​​

ClickHouse中文文档链接,请参见:​​clickhouse.yandex/docs/zh/​​ 和 ​​clickhouse.tech/docs/zh/development/architecture/​​

ClickHouse代码GitHub,请参见:​​github.com/ClickHouse/ClickHouse​​

1.3 ClickHouse支持的场景

  • 绝大多数是读请求
  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
  • 已添加到数据库的数据不能修改。
  • 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
  • 宽表,即每个表包含着大量的列
  • 查询相对较少(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每个查询有一个大表。除了他以外,其他的都很小。
  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中

1.4 数据存储

  • 列式数据存储
  • 行式数据
  • 列式数据
  • 对比分析

2 整合到SpringBoot

该案例基于:Druid连接池和mybatis进行整合。Druid 1.1.10 版本 SQL Parser对clickhouse的开始提供支持。

SpringBoot2如何实现与ClickHouse数据库的深度整合?

2.1 创建SpringBoot的Maven项目

首先创建一个模版项目,然后增加maven依赖以及SpringBoot基础依赖。

2.2 Maven依赖

第一步先从maven或者其他仓库,找到依赖,配置到pom.xml文件中。

……
<!-- Clickhouse-JDBC -->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2</version>
</dependency>

<!-- Druid Pool -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.12</version>
</dependency>

<!-- MhyBatis -->
<!-- mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>

<!-- Spring框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.6.6</version>
</dependency>


<!-- 工具类 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
……

2.3 配属数据源

在application.yml配置文件中配置数据源。

spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
click:
driverClassName: ru.yandex.clickhouse.ClickHouseDriver
url: jdbc:clickhouse://127.0.0.1:8123/default
initialSize: 10
maxActive: 100
minIdle: 10
maxWait: 6000

2.4 Druid连接池配置

@Configuration
public class DruidConfig {
@Resource
private JdbcParamConfig jdbcParamConfig ;
@Bean
public DataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(jdbcParamConfig.getUrl());
datasource.setDriverClassName(jdbcParamConfig.getDriverClassName());
datasource.setInitialSize(jdbcParamConfig.getInitialSize());
datasource.setMinIdle(jdbcParamConfig.getMinIdle());
datasource.setMaxActive(jdbcParamConfig.getMaxActive());
datasource.setMaxWait(jdbcParamConfig.getMaxWait());
return datasource;
}
}

2.5 数据库连接参数配置类

@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.click")
public class JdbcParamConfig {

private String driverClassName;
private String url;
private Integer initialSize;
private Integer maxActive;
private Integer minIdle;
private Integer maxWait;

}

3 结合MyBatis实际开发使用

结合MyBatis同其他使用MyBatis一致。