2023-01-03
mybatis源码学习
学习视频:https://www.bilibili.com/video/BV1Tp4y1X7FM?p=1&vd_source=cc82a52a9b9b8b31eca3aa74606e608a(这老师讲的真的很好)
分为4部分:动态代理MapperProxy、SQL会话SqlSession、执行器Executor、JDBC处理器StatementHandler
执行器
【1】简单执行器
simpleExecutor,每次执行SQL需要预编译SQL语句。
【2】可重用执行器
ReuseExecutor,同一SQL语句执行只需要预编译一次SQL语句
【3】批处理执行器
BatchExecutor,只针对修改操作的SQL语句预编译一次,并且需要手动刷新SQL执行才生效。
【4】执行器抽象类
BaseExecutor,执行上面3个执行器的重复操作,比如一级缓存、doQuery、doUpdate方法。
一级缓存命中条件
运行时参数相关:sql和参数必须相同、必须是相同的statementID(即mapper里面的方法相同)、sqlSession必须一样(会话级缓存)、RowBouds返回行范围必须相同
操作配置相关:未手动清空缓存(提交、回滚)、未配置flushCache=true、未执行update、缓存作用域不是STATEMENT
源码解析:当执行查询的时候会调用query()方法,判断是否存在缓存,存在则去PerpetualCache,里面有个HashMap;不存在则执行doQuery()方法,并且填充缓存
【5】二级缓存(应用级缓存)
定义:作用范围是整个应用,而且可跨线程使用。二级缓存有更高命中率,适合缓存修改较少的数据。
CachingExecutor,与一级缓存的区别:一级缓存查询数据库操作后会直接缓存,二级缓存需要当次数据库操作提交事务后才能进行缓存(二级缓存跨线程处理,一级缓存不用)。
源码解析:装饰器模式+责任链模式
Cache(设置缓存、获取缓存):
SynchronizedCache(线程同步)=》LogginCache(记录命中率)=》LRUCache(防溢出)=》ScheduledCache(过期清理)=》BLockingCache(防穿透)=》PerpetualCache(内存存储)
注:二级缓存优于一级缓存调用
2023-01-04
前端vue学习
现在项目用到了vue3,看了下vue3
发现原来vue3还和海贼王有关,one peace
vue3文档地址:https://cn.vuejs.org/guide/typescript/composition-api.html#typing-event-handlers
学习视频:https://www.bilibili.com/video/BV1SZ4y157m8/?spm_id_from=333.337.top_right_bar_window_history.content.click&vd_source=cc82a52a9b9b8b31eca3aa74606e608a
最直观的感受就是:
定义变量不用写到data、方法不用写到methods,直接套在setup里面就行(称之为composition API)。定义变量都可通过ref
<script setup>
</script>
然后打包方式也变了,以前是通过webpack,现在用vite
2023-01-05
微服务日志处理
【1】微服务链路追踪(接口监控)
场景:某个功能调用多个服务,需要去看哪个服务相应时间慢或者调用是否成功
解决方案:通过Sleuth,再加上Zipkin可视化查看
【2】微服务日志记录(日志监控)
场景:各个微服务都有自己的日志,日志分散
解决方案:通过ELK + Kafka。微服务将日志发送到Kafka,Kafka将日志给到Logstash,Logstatsh再将日志存储到Elasticsearch,Kibana将ES中的日志进行可视化查看
学习视频:https://www.bilibili.com/video/BV1a7411H71q?p=1&vd_source=cc82a52a9b9b8b31eca3aa74606e608a
2023-01-11
MySQL学习
-
学习资料
https://www.yuque.com/xuchenliang/qaqoxt
https://www.processon.com/mindmap/60596321637689700771c679
-
聚集索引和非聚集索引
聚集索引是索引结构和数据一起存放的索引;非聚集索引是索引结构和数据分开存放的索引。
CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,…);就是建立聚集索引
总结
1.使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
2.非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。
3.不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。
-
索引类型
主键索引、唯一索引、普通索引、全文索引
联合索引:可以用于避免回表(覆盖索引)
说明:普通索引会通过页级的指针来找到主键索引的主键,然后通过该主键索引找到相应的行数据
-
MySQL事物隔离级别
1.READ-UNCOMMITTED 读未提交
2.READ-COMMITTED 不可重复读
这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果
3.REPEATABLE-READ 可重复读
MySQL的默认事务隔离级别。
4.SERIALIZABLE 串行化
-
SQL分析
1、慢查询日志分析(MySQL开启慢查询,并且将SQL记录到某个文件)
2、show processlist 查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化
3、explain分析执行计划
select_type
表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等
type
表示表的连接类型,性能由好到差的连接类型为( system > const > eq_ref > ref > range > index > all)
一般来说, 需要保证查询至少达到 range 级别, 最好达到ref
possible_keys
表示查询时,可能使用的索引
key
表示实际使用的索引
rows
扫描行的数量
extra
执行情况的说明和描述
using index 表示MySQL将使用覆盖索引,以避免回表
-
MySQL模拟死锁
同时执行如下两条SQL就会出现错误:[Err] 1213 - Deadlock found when trying to get lock; try restarting transaction 即数据库发现死锁
产生原因:当事务1和事务2都开始执行,如果都执行到第一个SQL时,是不会产生死锁的,因为操作的是不同的行,此时事务1对id=1的这条记录加了独占锁,事务2对id=2的这条记录加了独占锁,由于事务都没提交,所以这两个独占锁都没有释放。
然后两个事务都继续往下执行,我们手动控制了事务1先执行它的SQL2,即更新id=2的这条记录,由于id=2的这条记录被事务2锁着,所以这条SQL语句会被阻塞,一直等待,也就是显示的“查询时间”。
接着事务2执行它的SQL2,即更新id=1的这条记录,又因为事务1锁着id=1的这条记录,所以,此时形成了相互等待对方持有的锁的局面,即发生了死锁。但,数据库不会任由这两个事务一直等待下去,所以事务2执行SQL2时提示死锁,“Deadlock found when trying to get lock; try restarting transaction”,事务1不受影响,commit之后事务1执行成功。
通过看数据库状态,可以看到死锁相关信息:show ENGINE INNODB status;
BEGIN;
update tabel1 set column1='1' where id=1;
update tabel1 set column1='1' where id=2;
BEGIN;
update table1 set column1='2' where id=2;
update table1 set column1='2' where id=1;
-
数据库常见锁
1、表级锁
MyISAM非事务性存储引擎,适用于以查询为主,少量更新的应用
2、行级锁
InnoDB存储引擎,适用于对事务完整性要求较高的系统。InnoDB支持行级锁和表级锁,默认为行级锁。
只有通过索引条件查询数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
InnoDB行级锁又分为:
(1) 共享锁:读锁,即多个事务对同一数据进行共享一把锁,都能访问到数据,但是只能读不能修改。
(2) 排他锁:写锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,只有获取排他锁的事务可以对数据进行读取和修改。
InnoDb引擎中update,delete,insert语句自动加排他锁;select …from…普通查询没有任何锁机制
SELECT * FROM table_name WHERE … FOR UPDATE
(3) 意向锁:InnoDB自动加的,不需用户干预。意向锁不会与行级的共享 / 排他锁互斥
3、页级锁
数据库中的乐观锁与悲观锁
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)