SpringBoot2 整合 ClickHouse数据库,实现高性能数据查询分析
本文源码:GitHub·点这里 || GitEE·点这里
一、ClickHouse简介
1、基础简介
Yandex开源的数据分析的数据库,名字叫做ClickHouse,适合流式或批次入库的时序数据。ClickHouse不应该被用作通用数据库,而是作为超高性能的海量数据快速查询的分布式实时处理平台,在数据汇总查询方面(如GROUP BY),ClickHouse的查询速度非常快。
2、数据分析能力
- OLAP场景特征
· 大多数是读请求
· 数据总是以相当大的批(> 1000 rows)进行写入
· 不修改已添加的数据
· 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
· 宽表,即每个表包含着大量的列
· 较少的查询(通常每台服务器每秒数百个查询或更少)
· 对于简单查询,允许延迟大约50毫秒
· 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
· 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
· 事务不是必须的
· 对数据一致性要求低
· 每一个查询除了一个大表外都很小
· 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中
- 列式数据存储
(1)、行式数据
(2)、列式数据
(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.DruidDataSourceclick:driverClassName: ru.yandex.clickhouse.ClickHouseDriverurl: jdbc:clickhouse://127.0.0.1:8123/defaultinitialSize: 10maxActive: 100minIdle: 10maxWait: 6000
3、Druid连接池配置
@Configuration
public class DruidConfig {@Resourceprivate JdbcParamConfig jdbcParamConfig ;@Beanpublic 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 () ;
}
这里就演示简单的三个接口。
2、Mapper.xml文件
<mapper namespace="com.click.house.mapper.UserInfoMapper"><resultMap id="BaseResultMap" type="com.click.house.entity.UserInfo"><id column="id" jdbcType="INTEGER" property="id" /><result column="user_name" jdbcType="VARCHAR" property="userName" /><result column="pass_word" jdbcType="VARCHAR" property="passWord" /><result column="phone" jdbcType="VARCHAR" property="phone" /><result column="email" jdbcType="VARCHAR" property="email" /><result column="create_day" jdbcType="VARCHAR" property="createDay" /></resultMap><sql id="Base_Column_List">id,user_name,pass_word,phone,email,create_day</sql><insert id="saveData" parameterType="com.click.house.entity.UserInfo" >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 id="selectById" parameterType="java.lang.Integer" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from cs_user_infowhere id = #{id,jdbcType=INTEGER}</select><select id="selectList" resultMap="BaseResultMap" >select<include refid="Base_Column_List" />from cs_user_info</select>
</mapper>
这里 create_day 是以字符串的方式在转换,这里需要注意下。
3、控制层接口
@RestController
@RequestMapping("/user")
public class UserInfoController {@Resourceprivate 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() ;}
}
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent
SpringBoot2 整合 ClickHouse数据库,实现高性能数据查询分析相关推荐
- 开源大数据查询分析引擎
引言 大数据查询分析是云计算中核心问题之一,自从Google在2006年之前的几篇论文奠定云计算领域基础,尤其是GFS.Map-Reduce.Bigtable被称为云计算底层技术三大基石.GFS.Ma ...
- 大数据处理系统都有哪些?(数据查询分析计算系统篇)
大数据的出现使得数据的处理效率提高不少,这得益于大数据的数据处理系统,而大数据的处理系统有很多.就目前而言,主要的大数据处理系统有数据查询分析计算系统.批处理系统.流式计算系统.迭代计算系统.图计算系 ...
- php 集成 spss,〖SPSS Modeler〗 IBM SPSS Modeler 整合不同数据库之间的数据
来自IBM DEVELOPERWORKS 简介 由于目前企业客户的业务量和数据量都在不断的提高,随着企业的发展,很多企业的数据存储都不局限于同一个数据库上,如果要对这些存储在不同数据库上的数据进行处理 ...
- 数据库作业4——数据查询
3.4 数据查询 3.4.1 单表查询 1 选择表中的若干列 (3)查询经过计算的值 2 选择表中的若干元组 (1)消除取值重复的行 (2)查询满足条件的元组 3 ORDER BY 子句 4. 聚集函 ...
- 按学号和姓名进行查询c语言,数据库实验4 数据查询(答案)
数据库技术与应用实验 实验4 数据查询 实验4 数据查询 学号:18103317 专业:电子信息工程 一.实验内容和步骤 1.在studentsdb数据库中,使用下列SQL语句将输出什么?并说明语句中 ...
- 数据库实验报告 数据查询
桂 林 理 工 大 学 实 验 报 告 班级软件2班学号3162052051734姓名梁振宇同组实验者 实验名称数据查询日期 2018年 06 月05 日 一.实验目的: 1. 观察查 ...
- 数据库——实验二 数据查询
1.实验目的 理解SQL 程序设计基本规范,熟练运用SQL 语言实现数据查询,包括单表查询.分组统计查询和连接查询.嵌套查询合和集合查询. 2.实验内容和要求 针对tpch 数据库或自建数据库test ...
- Android sqlite数据库update之后数据查询数据获取不实时。。。
最近写项目的时候用android自带的数据库SqliteDatabase,使用过程中发生了这样一件事情,我在Activity B中读取数据库表User中的数据,显示在UI上,然后跳转到Activity ...
- 大数据查询分析引擎比较
1.常见方案比较 首先,Hive/SparkSQL 在数据仓库的领域应用是比较广泛的,但是因为查询时延很难能够满足毫秒到秒级的要求,同时因为是离线计算,数据时效性也比较差. 其次,ES (Elasti ...
最新文章
- Spring3 MVC 注解---注解基本配置及@controller和 @RequestMapping 常用解释
- 在DNN中如何使FriendlyURL使用PageName作为页面名称
- Python类与对象技巧(1):字符串格式化、封装属性名、可管理的属性、调用父类方法
- python编程狮app题库_Python编程狮-零基础学Python im App Store
- PowerDesigner建数据库模型增加自定义扩展属性
- 互联网晚报 | 2月8日 星期二 | 上海微电子交付中国首台光刻机;广东诞生全国首个万亿工业强区;东芝宣布分拆为两家公司...
- background复合属性顺序_CSS的background属性的缩写顺序介绍
- Junit下获取src/test/resource路径
- dubbo连接线上服务,没有配置好引发的错误
- Bailian2933 停车场收费【水题】
- Jhipster创建微服务【0】——踩坑
- VRTK summary
- 三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
- 白化(Whitening) PCA白化 ZCA白化
- WPF另类实现摄像头录像并预览
- Postman中文版下载[9.12.0]
- Java程序设计-书上重点总结
- spark分布式矩阵采坑记
- 机器学习(二):k近邻法(kNN)
- 自然增长率,到底怎么算才合理!
热门文章
- qt利用QSplitter任意拆分窗口
- USACO-Section1.4 Barn Repair (贪心算法)
- Python 获取重定向url
- C/C++fflush(stdout)循环打印输出避免缓存区错误
- Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
- 基于开源蜜罐的实践与功能扩展
- 一句命令删除docker所有镜像或容器
- 2019牛客多校四 E. triples II (容斥)
- 在阿里云服务器centOs7系统中部署.NET Core项目
- 【leetcode-74】搜索二维矩阵