文章目录
Clickhouse
基础
概念:
背后的研发团队是俄罗斯的yandex公司,该公司是搜索引擎公司。
是关系数据库的一种,与传统的mysql不同采用行式存储不同,该数据库采用的是列式存储。
实操
windows + docker desktop 下载clickhouse
参考博客:https://blog.csdn.net/qubernet/article/details/121013960
存在问题1:
**命令出现问题:**
PASSWORD=$(base < /dev/urandom | head -c8); echo "testroot"; echo -n "123456" | sha256sum | tr -d '-'
需要通过apt-get下载 coreutils包 和 openssl包
**账号密码:**
testroot
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
testroot
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
两次运行的结果都一样。
最新处理数据:
quber
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
存在问题2:
问题描述:
按照参考博客配置,会出现:
std::exception. Code: 1001, type: std::out_of_range, e.what() = unordered_map::at: key not found (version 21.12.3.32 (official build))的问题
问题分析:
<quber>
这是XML元素的根标签,代表正在配置的ClickHouse用户名称,即“quber”。
<password_sha256_hex>
表示用户“quber”的密码经过SHA-256算法加密后得到此十六进制表示的哈希值;
<networks incl="networks" replace="replace">
incl=“networks” :指示可能有其他地方定义了一组通用的网络规则(如在父级配置或外部文件中),这里将包括(include)那些通用规则;
replace=“replace”:表示即使有通用规则存在,也应该完全替换(replace)为这里指定的网络规则,即只允许来自::/0的所有IPv6地址的连接。
<ip>::/0</ip>
指定了一个IPv6 CIDR块,::/0相当于IPv6中的“任意地址”,意味着用户可以从任何IPv6网络访问ClickHouse服务器。
<profile>quber</profile>
profile 指定了用户将使用的权限配置文件或访问控制配置文件的名称;
用户“quber”关联到同名的“quber”访问控制配置文件。
配置成quber不能实现访问,是否是quber的配置文件存在问题?待考证;
<quota>quber</quota>
quota 指定了用户将遵循的配额规则;
quber 同样表示用户将使用同名的配额配置文件;配额文件定义了该用户在资源使用方面的限制,如查询速率、磁盘空间使用量、内存使用量等,用于控制单个用户或用户组对系统资源的消耗。
配置成quber不能正常访问,是否不存在同名的配额配置文件?待考证;
想要配置成功,直接将profile和quota都配置成default即可。
存在问题3
描述:
vscode中采用SQLTools Clickhouse 插件,访问clickhouse数据库;
show databases; 命令可以使用
use xx数据库; 命令不可行,会报错;
scode使用 clickhouse插件 执行show databases 可以正常运行。但执行命令use xxx数据库 出现There is no session or session context has expired. 问题,给出具体原因以及解决方案
select * from 表1; 命令可以执行
分析:
具体原因未知。
存在问题4
描述:
多源数据库加载异常;
参考:
https://cloud.tencent.com/developer/article/2000075
springboot项目配置clickhouse
参考博客1:https://blog.csdn.net/csdn_xpw/article/details/121981940 待验证;
描述:
springboot项目+clickhouse配置信息,仅通过配置application.properties文件配置,数据库不能实现访问;
需要创建一个类A具有clickhouse涉及变量,然后被@ConfigurationProperties修饰;
由于配置了链接池druid,则需要创建一个配置类B,将A作为属性创建到B类中,然后创建返回DruidDataSource对象的方法。
分析:
原因在于:Properties中配置了druid连接池,但是在代码中没有配置。
Jdbc
参考博客:
https://blog.csdn.net/m0_37761437/article/details/110468944
基础
概述
定义:
全称:Java DataBase Connectivity(Java 语言连接数据库);
是sun公司制定的接口,在java.sql.*包下;
每个数据库底层实现原理不同,定义统一的接口,不同数据库厂商编写各自的实现类,有利于开发者使用;
其中各数据库厂商的驱动中含有JDBC的实现类,即都在各自的jar包里,使用时需要进行下载;
驱动 = jar包 ==》 含有JDBC实现类;
可以参考这个视频后续学习:
https://www.bilibili.com/video/BV1Uf4y1X7LK?p=27&spm_id_from=pageDriver&vd_source=c901ae3ff497a02016ba7bada52b2e3b
JDBC编程六步走
1 注册驱动
告诉Java程序,要连接的是哪个品牌的数据库
2 获取连接
表示JVM的进程和数据库进程之间的通道打开了
3 获取数据库操作对象
执行sql语句的对象
4 执行sql语句
DQL DML
5 处理查询结果集
只有4执行的是select,才有5
6 释放资源
java和数据库属于进程间的通信,开启之后一定要关闭
jdbcTemplate
配置
public JdbcTemplate jdbcTemplate(@Autowired DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
// 为了创建一个可以用来执行数据库操作的JdbcTemplate实例,同时避免了手动管理数据库连接的繁琐过程;
// @Autowired注解通常直接应用于字段或者构造器参数上,但是这里是在方法参数上使用,这表明Spring框架将会自动调用此方法,并将DataSource类型的Bean注入到方法中。然后,此方法将返回一个使用该DataSource实例化的JdbcTemplate对象。
使用
jdbcTemplate使用1:
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i)
throws SQLException {
ps.setInt(1, keys.get(i).getId());
ps.setString(2, keys.get(i).getLzKey());
ps.setInt(3, keys.get(i).getOriginIndex());
ps.setLong(4, keys.get(i).getCreateTime());
}
@Override
public int getBatchSize() {
return keys.size();
}
});
// 理解:
jdbcTemplate.batchUpdate(sql,...) --》 执行批量更新操作;
new BatchPreparedStatementSetter() { ... } --》 匿名内部类,实现这个接口,重写两个方法;
jdcbTemplate使用2:
List<LzKey> results = jdbcTemplate.query(sql, args,new RowMapperResultSetExtractor<>(LZ_KEY_MAPPER, 1));
// 理解:
jdbcTemplate.query(sql, args,...) --》 执行sql查询操作返回结果集;
sql = 查询语句的字符串;
args = 数组,即sql中的占位符;
参数3 = 如何处理查询的结果;
new RowMapperResultSetExtractor<>(LZ_KEY_MAPPER, 1)
是一个匿名内部类,继承RowMapperResultSetExtractor类,该类实现了ResultSetExtractor接口;
将ResultSet映射到java对象列表中;
参数1:一个RowMapper实例,将ResultSet中的一行映射到一个LzKey对象;
参数2:指定预期的行数,意味着结果集中最多只有一行数据;
jdbcTemplate使用3:
jdbcTemplate.queryForObject(sql, Integer.class);
// 理解:
用于执行sql的一个查询语句,并将结果映射为一个单一对象,且对象的类型是Integer。
Druid
基础
数据库连接池
技术背景:
最初程序要想操作数据库,需要向系统底层获取一个连接,然后再访问数据库,使用完成之后,关闭连接;
连接池:
创建一个容器存放连接对象,程序每次使用连接对象去访问数据库,使用结束之后,再放回来;
定义:
一个容器(集合),存放数据库连接的容器;
当系统初始化结束后,容器被创建,容器中会申请一些连接对象,用户访问数据库时,从容器中获取连接对象,访问结束后,将连接对象归还给容器;
好处:
节约资源;用户访访问高效
实现:
标准接口DataSource javax.sql包下,方法:
获取连接getConnection()
归还连接,如果连接对象Connection是从连接池中获取的,那么调用Connection.close(),则就表示归还连接;
一般不去实现,有数据库厂商来实现,有C3P0和Druid(阿里巴巴提供的)。
基础概念
定义:
目前最好的数据库连接池;本质是对DataSource接口的一种实现;
功能:
数据库连接池的支持;
性能高效;
有完整的监控;
针对SQL、Spring、WEB应用、Session等有良好的监控,还提供SQL防火墙功能(DELETE FROM 表名称);
使用过程
导入jar包:现有项目所见依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
定义配置文件:
properties以及yml类型;
获取数据库连接池对象:
通过工厂来获取 DruiDataSourceFactory ;
直接通过new DruidDataSource创建对象;(现有项目通过该方法实现)
获取连接:
通过getConnection
JDBC实现
采用工具类的形式,完成数据库连接池的创建以及使用;
关闭连接会涉及到方法重载,执行DML需要Statement和connection,执行DQL需要ResultSet、Statement和connection;
测试工具类:
MyBatis实现
实战
Spring JPA
prometheus
基础
作用:
Prometheus 来监控应用,并利用 Grafana 根据指标生成图表,以提高软件的可观察性。
参考:https://springdoc.cn/spring-boot-prometheus/