09.30 SpringBoot2 整合 ClickHouse數據庫,實現高性能數據查詢分析

本文源碼

一、ClickHouse簡介

1、基礎簡介

Yandex開源的數據分析的數據庫,名字叫做ClickHouse,適合流式或批次入庫的時序數據。ClickHouse不應該被用作通用數據庫,而是作為超高性能的海量數據快速查詢的分佈式實時處理平臺,在數據彙總查詢方面(如GROUP BY),ClickHouse的查詢速度非常快。

2、數據分析能力

· OLAP場景特徵

大多數是讀請求
數據總是以相當大的批(> 1000 rows)進行寫入
不修改已添加的數據
每次查詢都從數據庫中讀取大量的行,但是同時又僅需要少量的列
寬表,即每個表包含著大量的列
較少的查詢(通常每臺服務器每秒數百個查詢或更少)
對於簡單查詢,允許延遲大約50毫秒
列中的數據相對較小: 數字和短字符串(例如,每個URL 60個字節)
處理單個查詢時需要高吞吐量(每個服務器每秒高達數十億行)

事務不是必須的
對數據一致性要求低
每一個查詢除了一個大表外都很小
查詢結果明顯小於源數據,換句話說,數據被過濾或聚合後能夠被盛放在單臺服務器的內存中

· 列式數據存儲

(1)、行式數據

SpringBoot2 整合 ClickHouse數據庫,實現高性能數據查詢分析

(2)、列式數據

SpringBoot2 整合 ClickHouse數據庫,實現高性能數據查詢分析

(3)、對比分析

分析類查詢,通常只需要讀取表的一小部分列。在列式數據庫中可以只讀取需要的數據。數據總是打包成批量讀取的,所以壓縮是非常容易的。同時數據按列分別存儲這也更容易壓縮。這進一步降低了I/O的體積。由於I/O的降低,這將幫助更多的數據被系統緩存。

二、整合SpringBoot框架

該案例基於:Druid連接池和mybatis進行整合。Druid 1.1.10 版本 SQL Parser對clickhouse的開始提供支持。

1、核心依賴

<dependency>
<groupid>ru.yandex.clickhouse/<groupid>
<artifactid>clickhouse-jdbc/<artifactid>
<version>0.1.53/<version>
/<dependency>

2、配屬數據源

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

3、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;
}
}

4、參數配置類

@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 ;
// 省略 GET 和 SET
}

這樣整合代碼就完成了。

三、操作案例演示

1、Mapper接口

public interface UserInfoMapper {
// 寫入數據
void saveData (UserInfo userInfo) ;
// ID 查詢
UserInfo selectById (@Param("id") Integer id) ;
// 查詢全部
List<userinfo> selectList () ;
}
/<userinfo>

這裡就演示簡單的三個接口。

2、Mapper.xml文件

<mapper>
<resultmap>

<result>
<result>
<result>
<result>
<result>
/<resultmap>

id,user_name,pass_word,phone,email,create_day

<insert>
INSERT INTO cs_user_info
(id,user_name,pass_word,phone,email,create_day)
VALUES
(#{id,jdbcType=INTEGER},#{userName,jdbcType=VARCHAR},#{passWord,jdbcType=VARCHAR},
#{phone,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR},#{createDay,jdbcType=VARCHAR})
/<insert>
<select>
select
<include>
from cs_user_info
where id = #{id,jdbcType=INTEGER}
/<select>
<select>

select
<include>
from cs_user_info
/<select>
/<mapper>

這裡 create_day 是以字符串的方式在轉換,這裡需要注意下。

3、控制層接口

@RestController
@RequestMapping("/user")
public class UserInfoController {
@Resource
private UserInfoService userInfoService ;
@RequestMapping("/saveData")
public String saveData (){
UserInfo userInfo = new UserInfo () ;
userInfo.setId(4);
userInfo.setUserName("winter");
userInfo.setPassWord("567");
userInfo.setPhone("13977776789");
userInfo.setEmail("winter");
userInfo.setCreateDay("2020-02-20");
userInfoService.saveData(userInfo);
return "sus";
}
@RequestMapping("/selectById")
public UserInfo selectById () {
return userInfoService.selectById(1) ;
}
@RequestMapping("/selectList")
public List<userinfo> selectList () {
return userInfoService.selectList() ;
}
}
/<userinfo>

這樣案例就完成了。

SpringBoot關聯閱讀:

SpringBoot2 整合 ClickHouse數據庫,實現高性能數據查詢分析


分享到:


相關文章: