一、 关于事务
1、调用同一个类下的@Transactional方法,事务失效。
2、 @Transactional 注解中的对象如果已被Spring容器管理, 异常会被try catch捕获到, 但@Transactional依然生效。
二、关于Stream流
1、Stream流对象无法再次赋值,相当于是finallized的
Tomcat :servlet容器
war包部署 :打包成 .war 部署 -- web应用
文件夹部署:
<Context path = "xxxxx" docBase = "xxxx"/>
SpringBoot 内置的Tomcat:识别jar中的servlet
servlet容器:
请求 Request -->
- Engine:管理Host List<Host> hosts,pipeline
- Host: 虚拟主机 (localhost/xxx.com) List<Context>,Pipeline
- Context: List<Wrapper>,Pipeline
- Wrapper:-- servlet实例 某一个Servlet类 List<Servlet>,Pipeline
Pipeline:管道 List<Valve>:阀
三、关于replace()方法
分布式事务:
Saga senta
commit rollback
逆向操作 tcc补偿
词法分析器
优化器:用哪个索引
执行器:调用引擎 innodb
Bin-log日志备份
explain select * from rule_result_detail
force index(IDX_RULE_RESULT_DETAIL_01)
where REF_ID > '1414556757244096513'
-- 强制使用索引
索引下推:组合索引时,以前只看like字段,5.6 后,还会再看后面几个索引的值
回表:
覆盖索引:
explain select * from rule_result_detail;
show warnings;
show global variables like 'wait_timeout';
-- query_cache_type: 是否使用缓存
explain select * from rule_result_detail
force index(IDX_RULE_RESULT_DETAIL_01)
where REF_ID > '1414556757244096513'
Order by : Using filesort 没有走索引 --extra
order by null -- group by 时强制不排序
文件排序 using filesort:扫描聚簇索引
using filesort:扫描二级索引
单路排序:将结果lode到内存排序:占用排序内存大,不需要回表
双路排序:将结果拿id和排序字段load到内存排序,再进行回表;占用排序内存小,需要回表
设置 trace
数据库索引优化:
1)join
1.1 嵌套循环连接 nested-loop join (NLJ)
Select * from t1(10000条) join t2(100条) on t1.a=t2.a(索引)
从t2表拿数据去t1表扫描,t1走索引(磁盘扫描)
1.2 基于块的嵌套循环连接Block nested-loop join(BNL)
Select * from t1(10000条) join t2(100条) on t1.b=t2.b(不是索引)
将t2的所有数据放到 join_buffer(内存扫描)
把t1的每一行取出来,跟join_buffer做对比
1)被驱动表关联字段加索引
2)小表驱动大表 straight_join 指定驱动表(只适用于inner_join)
In 和 exists 的区别:in 后面的先执行,exists后面的后执行
count(*)~count(1)>count(name) 有索引 /count(id)
innoDB: MVCC机制
dateTime 和 timeStamp
Mysql 事务隔离机制:ACID
可重复读: 读的不是实时的数据,而是事务之前的快照
MVCC: muti-version concurrency control 多版本并发控制机制 读写操作并发的时候,可以不用加锁,查询语句不加锁
Read Commited 和 Repeatable 下实现
undo日志:
在执行语句前生成readView,update语句生成版本号id,select 语句不生成版本号id
readView:【1,2】,3
BufferPool缓存机制:
不是直接将磁盘文件的数据直接修改,而是将涉及到的数据页加载到bufferPool中,
修改后写入reDo日志,提交事务,从bufferPool中将数据更新到磁盘文件中。(????不太严谨,只是大概)
可串行化:select 也会加锁
间隙锁:
临键锁:
行锁是建立在索引上的,如果没有索引,会升级为表锁。
Java 锁,Redies分布式锁
Dubbo 的架构主要包含四个角色,其中 Consumer 是服务消费者,Provider 是服务提供者,Registry 是注册中心,Monitor 是监控系统。
具体的交互流程是 Consumer 一端通过注册中心获取到 Provider 节点后,通过 Dubbo 的客户端 SDK 与 Provider 建立连接,并发起调用。Provider 一端通过 Dubbo 的服务端 SDK 接收到 Consumer 的请求,处理后再把结果返回给 Consumer。
索引:
二叉树:
红黑树:
Hash: 哈希算法MD5,CRC16
B+:
MyISAM:索引文件和数据文件是分离的MYI、MYD
INNODB:.frm、.ibd 只有一个聚簇索引--主键索引
回表
Linux
show processlist
kill 26
Vim 文件路径 :编辑模式
一、TCP的三次握手 syn,syn ack,ack,四次挥手fin, fin ack ,fin, ack
二、数据库索引:
B+:叶子节点包含所有数据, 索引有冗余
Hash:等值查询,不支持范围查找
InnoDB:聚簇
覆盖索引: using index,查询的结果字段在索引树里本来就包含,不需要回表。
回表:
优先查找二级索引,因为只存主键地址,数据量少。
翻页
长连接:8H
在已经连接的情况下,更改mysql 权限表,不实时更新
IoC 是什么?
IoC即控制反转,简单来说就是把原来代码⾥需要实现的对象创建、依赖反转给容器来帮忙实现,需要创建⼀个容器并且需要⼀种描述让容器知道要创建的对象间的关系,在 Spring 中管理对象及其依赖关系是通过 Spring 的 IoC 容器实现的。
IoC 的实现方式有依赖注⼊和依赖查找,由于依赖查找使⽤的很少,因此 IoC 也叫做依赖注⼊。
依赖注入具体怎么实现的呢?
依赖注⼊指对象被动地接受依赖类⽽不用自己主动去找,对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它依赖的类注入给它。假设⼀个 Car 类需要⼀个 Engine 的对象,那么⼀般需要手动 new一个 Engine,利用 IoC 就只需要定义⼀个私有的 Engine 类型的成员变量,容器会在运行时自动创建⼀个 Engine 的实例对象并将引用自动注⼊给成员变量。
Array List:
1 底层由什么组成?有什么特点?
1)由于数组以一块连续的内存空间,每一个元素都有对应的下标,查询时间复杂度为O(1)。好比你去住酒店,每个房间都挨着,房门都写着房间号。你想找哪一间房是不是很容易。
2)相对的,一块连续的内存空间你想打破他就没那么容易,牵一发而动全身,所以新增和删除的时间复杂度为O(n),想像你在做excel表格的时候,想增加一列,后面的列是不是都要跟着移动。
3)元素有序,可重复。可用在大多数的场景,这个就不需要过多解释了。