add logseq-java

This commit is contained in:
Lostecho
2024-02-02 00:12:49 +08:00
parent 1cd5bb460f
commit c7947017c3
875 changed files with 57100 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
- Async也是一个AOP
- 三级缓存里面的lambda表达式只会去执行AspectJ的注解的AOP
- 执行Async的时候出现循环依赖是不会提前判断是否执行@Async从而不会提前AOP但是后面执行AOP的时候又会生成另一个代理对象
- 后续生成了另一个代理对象,会比较两个对象,不同就会报错
- 想要解决可以再注入的对象上添加@Lazy注解添加了这个注解之后B注入的就只是一个代理对象调用的时候才会查找是否有这个Bean

View File

@@ -0,0 +1,4 @@
- 表示某个属性是要自动注入
- 加在属性上会自动对该属性赋值,先按照类型后按照名称匹配
- 用在方法上时,会根据参数类型,参数名称找到对象并通过反射进行创建
- 加载构造方法上会使用该构造方法

View File

@@ -0,0 +1,5 @@
- SpirngBoot.jar calss文件已经编译好了
- 已经编译好了,不会编译报错
- 运行报错
- 通过ASM来读取字节码操作字节码来读取注解从而不用再JVM加载全部的类再扫描
- 利用ASM读取到字符串信息后利用applicationContext.getClassLoader().loadClass("UnderTow.class")

View File

@@ -0,0 +1,5 @@
- 不添加这个注解的时候会事务失效
- jdbc连接和事务管理器是两个连接对象
- jdbcTemplate从ThreadLocal可以获取事务管理连接事务管理会创建连接并保存到ThreadLocal<Map<DataSourceconn>>中jdbc获得不到该事务管理器创建的连接会去创建一个新的连接而这个连接会自动提交
- 添加了Configuration注解之后会使得jdbc和事务管理的连接的数据源是同一个
- 有多个数据源的时候添加了这个注解也可能会失效

View File

@@ -0,0 +1,2 @@
- @Resource按名称装配
- @Autowire按属性装配

7
logseq-java/pages/API.md Normal file
View File

@@ -0,0 +1,7 @@
- Application Programming Interface
- 应用编程接口
- 在Java中提供了大量的类接口函数等一系列基础工具
- 目的
- 简化程序员开发
- JDK1.8 API文档
- [JDK1.8.CHM](../assets/JDK1.8_1649904511236_0.CHM)

View File

@@ -0,0 +1,10 @@
- American Standard Code for Information Interchange
- 共128个字符
- [ASCII表](https://www.runoob.com/w3cnote/ascii.html)
- 拓展
- 欧洲 ISO/IEC 8859
- 中国 GB2312 --> GBK
- 统一码(Unicode) UTF-8 UTF-16 UTF-32
- 全世界通用 UTF-8
- [[转码]]
- [[解码]]

View File

@@ -0,0 +1,60 @@
- ```java
Arraylist datas = new ArrayList<>();
```
- 是[[List]]的实现类
- 常用[[API]]
- 添加元素[[add]](),[[addAll]]()
- 不能添加 [[基本数据类型]] ,底层将[[int]]类型包装为 [[Integer]] 类型
- ```java
ArrayList datas = new ArrayList();
datas.add("name");
datas.add(1)
```
- [[size]]()
- [[get]]()
- [[add]](int indexelement e)
- 将元素插入指定下标。后面的元素后移一位
- [[set]]()
- [[remove]]()
- [[contains]]()
- [[indexOf]]()
- 返回元素出现在集合中第一个位置的下标
- [[isEmpty]]()
- 判断内部是否有元素
- [[clear]]()
- 集合遍历
- ((625782a9-64e5-4f9a-8d40-45ed6f9ddaf9))
- ((625782a9-c1c2-413d-b1cf-255ecbea27d4))
- [[迭代器]] [[Interator]] 遍历
id:: 625e1ecf-25a9-4b64-8eab-042fd889a062
- ```java
//返回迭代器
Iterator its = datas.iterator();
while(its.hasNext()){
//获得的元素
Object ele = its.next;
System.out.println(ele);
//边取边删除
its.remove()
}
```
- [[集合排序]] #排序
- [[数组排序]] Arrays.sort
- 集合工具包[[Collections]]
- [[addAll]]
- 向集合中添加元素
- Collecetions.addall(datas,"ele1","ele2","ele3",...)
- [[sort]]
- Collestions.sort(datas)
- 自定义 [[引用数据类型]] 要用到使用到[[Comparable]]接口
- [[重写]][[compareTo]]
- 然后调用sort方法
- [[自然排序]]
- [[自定义排序]]
- 自己定义比较器,完成排序规则
- 不需要实现Comparable接口
- sort(List,Comparator<T>)
- 重写compare
- 底层结构
- 底层是数组结构
- 初始长度为0加第一个元素长度变10后面每次长度增加都是原来的1.5倍

View File

@@ -0,0 +1,6 @@
- [[toString]]
- Arrays.toString()
- [[sort]]
- [[binarySearch]]
- [[copyOf]]
- [[equals]]

View File

@@ -0,0 +1,63 @@
- 每个页大小为16K页的结构
- 页标识
- 最小记录record_type=2
- 最大记录record_type=3
- 普通记录record_type=01是B+树非叶子节点记录
- recore_type+next_record+c1列+c2列+c3列+其他信息该id所在页
- 非叶子节点不存储数据,之存储主键,页之间使用双向链表连接,方便范围和反向排序查询
- 聚簇索引
- 主键作为索引的值
- 索引和数据保存在同一个文件中
- 页内记录按照主键大小排序排成一个单向链表
- 页和页之间根据主键大小排序成一个双向链表
- 非叶子节点存储记录主键和页号
- 叶子节点存储完整的用户记录
- 优点
- 数据访问更快
- 对于主键排序查找和范围查找非常快
- 查询一定范围数据是由于数据相连可以从更少数据快中提取数据节省IO操作
- 缺点
- 插入速度依赖插入顺序,按照主键顺序插入最快,否则会出现页分裂,影响性能
- 更新主键代价非常高,将导致被更新的行移动
- 限制
- 只有InnoDB支持MyISAM不支持
- 每个表只能有一个
- 没有定义主键时将选取非空唯一列代替没有就隐式定义一个主键rowID
- 为了充分利用表中主键应该选择有序的ID不建议使用UUIDMD5Hash字符串作为主键
- 查找和匹配逻辑
- 根据第一层对应的范围找到第二层的页地址
- 根据第二层的数据找到对应的下一层页地址直到找到record_type=0存放普通数据的叶子节点的页地址
- 再叶子节点上定位到对应的数据
- 非聚簇索引
- 非主键索引外的其他索引
- 页间的记录根据所选类的大小排序
- 页和页也是通过双向链表连接的
- 非叶子节点记录数据值和页号
- 非叶子节点存储数据值和主键
- 可以有多个
- 查找匹配逻辑
- 查找的过程与聚簇索引前面一样
- 找到对应记录的主键数值
- 根据主键值去聚簇索引中查找一遍
-二叉树平衡二叉树红黑树B树的区别
- 二叉树
- 不能平衡,容易变成链表
- 平衡二叉树
- 可以通过自旋转保证左右两边高度平衡
- 树的高度过高
- 红黑树
- 自旋速度比较快
- 非严格平衡二叉树
- B树
- 非叶子节点页存储数据
- 一个B+树存放多少索引记录
- 三层千万级别
- 数据占用1KB指针和键值10字节
- 16x1600x1600=40960000
- B+树crud效率如何
- 新增和删除比较麻烦,需要更新索引,查询和更新效率高
- O(lognN) N为高度
- 自适应哈希索引
- InnoDB一个特殊功能某些索引值使用非常频繁会再内存中基于B+树所有值之上创建一个哈希索引,从而具有哈希索引一些特点
- 2-3树2-3-4树
- 多叉树允许每个节点可以有更多的数据项和子节点,通过增加分叉减少树的高度

View File

@@ -0,0 +1,15 @@
- 用来表示Bean定义
- Spring根据BeanDefination来创建Bean对象有很多属性来描述Bean
- beanClass
- 表示一个Bean的类型根据此属性实例化得到对象
- scope
- 表示一个Bean的作用域
- isLazy
- 表示是否需要懒加载,原型不起作用
- dependsOn
- 表示一个Bean再创建前需要依赖的其他Bean一个Bean创建前这些需要创建好
- primary
- 表示一个Bean是主Bean一个类型可以存在多个Bean依赖注入是有主Bean会选择主Bean注入
- initMethodName
- 一个Bean的初始化方法初始化阶段会调用这个方法可以自定义逻辑对这个加工
- @Component@Bean、\<bean />都会解析为BeanDefinatino

View File

@@ -0,0 +1,16 @@
- 一种Spring容器可以用来创建Bean
- BeanFactory用 [[BeanDefination]]来生成Bean
- 核心子接口和实现类
- ListableBeanFactory
- ConfigurableBeanFactory
- AutowireCapableBeanFactory
- AbstractBeanFactory
- DefaultListableBeanFactory
- 最重要
- 单例Bean
- Bean别名
- 父子BeanFactory
- Bean类型转化
- Bean后置处理
- 支持FactoryBean
- 支持自动装配

View File

@@ -0,0 +1,10 @@
- 一个Bean创建和销毁过程中所经历的步骤可以利用Bean的生命周期对Bean进行自定义加工
- [[BeanDefination]]
- 构造方法推断
- 实例化,通过构造方法反射获取实例
- 属性填充,自动注入,依赖注入
- 初始化
- 初始化前BeanPostProcess
- 初始化initliazeBean
- 初始化后AOP
- 销毁

View File

@@ -0,0 +1,19 @@
- 解决[[基本数据类型]]浮点数[[float]][[double]]在参与运算时存在丢失精度的问题
- ```java
//使用字符串作为参数,最精准
BigDecimal a = new BigDecimal("0.1");
```
- 加减乘除
- ```java
a.add(b);
a.subtract(b);
a.multiply(b);
a.divde(b);
```
- 收尾规则
- ROUND_DOWN去尾模式
- 直接去掉后面的数
- ROUND_UP收尾模式
- 判断最后舍弃的那个位置是否为0,非0则加1
- ROUND_HALF_UP
- [[四舍五入]]

View File

@@ -0,0 +1,5 @@
- CompareAndSwap
- CAS实现是借助C/C++调用CPU指令实现的
- 循环时间长,开销大
- 只能保证一个共享变量的原子操作
- ABA问题

View File

@@ -0,0 +1,8 @@
- ABA问题
- 添加版本号
- AtomicInteger
- 自旋时间过长
- 单次不一定能够成功
- 线程竞争不激烈才能成功
- 范围不能灵活控制
- 通过一个新的类整合共享变量

View File

@@ -0,0 +1,17 @@
- Concurrent Mark Sweep
- 用户线程可以和垃圾收集器线程共同运行
- 初始标记
- 找到所有GCRoot直接能够引用的对象速度很快
- 并发标记
- 从GCRoot直接关联对象开始遍历整个对象图时间较长但是不需要停顿用户线程
- 可以和用户线程并行
- 重新标记
- 修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象
- 多标解决比较麻烦,因此多标导致的浮动垃圾在下一轮处理
- 主要解决少标问题
- 并发清理
- 开启用户线程GC线程对未标记区域做清理有新增对象标记为黑色并不做任何处理
- 并发重置
- 重置本次GC中的标记数据
-
- 并发收集,低停顿

View File

@@ -0,0 +1,2 @@
- 并发失败concurrent mode failure
- 进入stop the world用serial old垃圾收集器回收

View File

@@ -0,0 +1,23 @@
- Java中所有[[类]]都是Class类型的[[对象]]
- 类加载器负责加载所有的类,class字节码文载入到内存中载入到内存的类[[JVM]]会创建一个Java.lang.Class对象
- 通过该class对象可以访问该类的所有方法
- 获取该类的class对象
- 1. 访问类的class属性
2. 调用对象的getClass()方法
先new一个对象再使用
3. 通过类的全限定名字符串加载
- java.lang.reflect包
- 通过[[反射]]调用该类的构造方法
- 通过getConstructor()
- 1. 获取该类的Class对象
2. getConstructor()获取构造器
3. 通过newInstance() 新建对象
- getConstructors()
- 获取所有构造器
- 访问属性
- getField()
- set()
- 访问方法
- gerMethod()
- invoke()
-

View File

@@ -0,0 +1 @@
-

View File

@@ -0,0 +1 @@
- 参考[[Collection 和 Collections 有什么区别]]

View File

@@ -0,0 +1,3 @@
- [[集合]]
- 是一套父[[接口]]
-

View File

@@ -0,0 +1 @@
- 参考 [[Collection 和 Collections 的区别是啥]]

View File

@@ -0,0 +1,4 @@
- jdk1.7使用了默认16个segment分段每一个segment操作不会影响其他segment
- 1.8使用node数组每一个头节点都加了sync锁同时通过自旋和cas操作来保证初始化
- 插入时通过cas来尝试写入失败就自旋
- 查找时通过哈希计算位置然后查找执行节点如果头节点哈希值小于0就在扩容或是红黑树使用find查找链表就用遍历的方法

View File

@@ -0,0 +1,5 @@
- 操作不同段map时可以并发执行
- 分成很多段时会浪费内存空间
-
- 1.8
- synchronized和CAS锁住一个node

17
logseq-java/pages/DOS.md Normal file
View File

@@ -0,0 +1,17 @@
- ### DOS命令
- DOS窗口
- win+R --> [[CMD]]
- [[cd]]命令
- 进入到某一个目录
- [[dir]]命令
- 列出所有文件及子目录
- 跳转盘符 d:
- 跳转到其它磁盘
- [[cls]]清屏
- 清空屏幕
- [[ping]]测试
- 测试网络是否连通
- [[ipconfig]]
- 获得本机的ip地址信息
- [[exit]]
- 退出DOS窗口

View File

@@ -0,0 +1,5 @@
- cd 目录
- cd x:
- dir
- ipconfig
- ping

View File

@@ -0,0 +1 @@
- 用Date类计算日期特别麻烦,因此使用 [[Calendar]]计算

View File

@@ -0,0 +1,29 @@
- Eclipse基本介绍
- 打开
- 界面
- 初始设置
- 改变默认字体大小
- 修改默认编码模式
- 使用Eclipse新建项目完成HelloWorld
- 1. 新建项目
2. 输入项目名称
3. 项目结构
4. 新建java程序
5. Package位置输入包名
6. 右侧代码编辑区域写代码
7. 点击工具运行按钮
8. 点击下方Console界面查看结果
- 快捷键
id:: 6241c521-c1c0-4c83-9834-058144ce2e88
- Alt+上下键 调整代码顺序
- Shift+左右键 选择光标左右代码
- Ctrl+Shift+F 格式化代码
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+X 剪切
- Ctrl+D 删除一行
- Ctrl+Z 撤销
- Ctrl+Y 回撤
- Ctrl+S 保存
- 项目导出
- 项目导入

View File

@@ -0,0 +1,25 @@
- 一个分布式的开源搜索和分析引擎,在[[Apache]][[Lucene]]的基础上开发而成
- 优势
- 速度快
- 具有分布式的本质特征
- 包含一系列的广泛功能
- 简化了数据采集,可视化和报告过程
- [[Cluster]]集群
- Node节点
- 一个节点是一个ES的实例
- Shard分片
- 基于分片可进行分布式的并行的操作,进而提高性能,吞吐量
- 与 [[MySQL]]的比较
- [[Docker]]安装
- ```yml
# PATH /usr/local/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
```
- ```bash
docker run -d --name es -v /usr/local/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -p 9200:9200 -p 9300:9300 --privileged=true -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" registry.cn-hangzhou.aliyuncs.com/elasticsearch/elasticsearch:7.2.1
```

View File

@@ -0,0 +1,45 @@
- # 注册中心
- spring netfilx的核心组件之一
- 用于注册服务和地址,实现服务信息注册和查找
- 维护服务名称和服务实例对应关系
- 每个微服务都会向注册中心获取服务列表,汇报运行状态,当有其他服务调用是,可以从服务列表中获取实例地址调用
- 服务端配置
- 启动类注解`@EnableEurekaServer`
- ```yaml
spring:
application:
name: eureka-server # eureka-server,Server名字自定义
server:
port: 8761 # eureka-server port, default is 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka-server default zone 向Eureka Server注册时,注册中心地址
register-with-eureka: false # eureka-server register-with-eureka, false 不向注册中心注册
fetch-registry: false # eureka-server fetch-registry, false 是否获取注册信息
```
- 客户端配置
- 启动类注解
- `@EnableDiscoveryClient`用于可能使用其它注册中心时
- `@EnableEurekaClient`用于仅使用Eureka注册中心
- ```yaml
spring:
application:
name: eureka-client # eureka-client 客户端向注册中心注册的服务ID
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka # 注册中心地址
```
- 服务续约
- 默认30s发送一次心跳超时90s
- 自我保护机制
- 因网络故障导致服务不可用时的一种保护机制
- 网络异常,服务正常的
- 开启后不剔除故障服务,等待修复网络正常
- 高可用
- 注册中心集群,防止某个服务宕机
- 注册中心相互注册,客户端同时在两个注册中心注册

View File

@@ -0,0 +1 @@
- First In First Out

View File

@@ -0,0 +1 @@
- File类用来代表程序外部文件或文件夹

View File

@@ -0,0 +1,8 @@
- 初始标记
- 暂停线程记录GCROOT直接引用对象
- 并发标记
- 最终标记
- 筛选回收
- 对各个Region的回收价值和成本进行排序根据最大停顿时间设置来进行回收
- 最大停顿时间
- 可以通过设置用户期望的GC停顿STW时间制定回收计划

View File

@@ -0,0 +1 @@
- 把内存按照Region来回收后台维护一个优先列表根据允许的收集时间优先选择回收价值最大的Region从而确保有限时间内尽可能高的收集效率

View File

@@ -0,0 +1,2 @@
- 将GC Root对象作为起点从这些节点开始向下搜索引用的对象找到的对象标记为非垃圾其它为垃圾
- 根节点:线程栈的本地变量,静态变量,本地方法栈的变量

3
logseq-java/pages/GC.md Normal file
View File

@@ -0,0 +1,3 @@
- Garbage collection
- 垃圾回收
- 回收失去引用的对象

View File

@@ -0,0 +1,11 @@
- 需要代码运行到安全点或安全区域才能做
- 安全点
- 代码中一些特定位置,这些位置的状态是确定的
- 方法返回之前
- 调用某个方法之后
- 抛出异常的位置
- 循环的末尾
- 当需要垃圾回收中断线程时,不直接对线程操作,简单设置一个标志位,当线程到达安全位置时检查这个标志,发现中断标志为真时在安全点上主动挂起
- 安全区域
- 一个线程处于sleep或中断状态就不能响应JVM中断请求再运行到安全点上
- 在一段代码片段中引用关系不会发生改变这个区域内任何地方开始GC都是安全的

3
logseq-java/pages/Git.md Normal file
View File

@@ -0,0 +1,3 @@
- github
- gitee
-

16
logseq-java/pages/HTML.md Normal file
View File

@@ -0,0 +1,16 @@
- HyperText Markup Language
- 结构
- 声明`<DOCTYPE html>`
- 完整HTML页面`<html>`
- 头部`<head>`
- 页面内容<body>
- 标题
- 通过<h1> - <h6>定义
- 段落
- 通过<p>标签定义
- 链接
- 通过<a>标签定义
- 图像
- 通过<img>标签定义
- 注释
- 通过`<!-- text-->`来注释

View File

@@ -0,0 +1,46 @@
- [[Map]]集合中的一种实现
- 底层结构
- JDK1.7前:[[数组]]+ [[链表]]
- JDK1.7后:[[数组]]+[[链表]]+ [[红黑二叉树]]
- 用法
- ```java
HashMap<String,String> datas = new HashMap<>();
```
- [[put]]
- [[putAll]]
- [[get]]
- [[getOrDefault]]
- 允许放[[null]]键null值
- [[replace]]
- [[remove]]
- [[clear]]
- [[keySet]]
- [[values]]
- [[去重]]
- 依靠Hashcode和equals
- HashSet的底层是HashMap的key
- Keys要重写equals和hashCode
- 遍历
- [[forEach]]
- ```java
datas.forEach(new BiConsumer<Girl, Boy>() {
@Override
public void accept(Girl key, Boy value) {
System.out.println("key=" + key + ",value" + value);
}
});
```
- 获得键的集合
- ```java
Set<Girl> keys = datas.keySet();
for (Girl e : keys) {
System.out.println("key=" + e + ",value=" + datas.get(e));
}
```
- [[entrySet]]
- ```java
Set<Map.Entry<Girl, Boy>> entries = datas.entrySet();
for (Map.Entry<Girl, Boy> e : entries {
System.out.println("key=" + e.getKey() + ",value=" + e.getValue());
}
```

View File

@@ -0,0 +1,6 @@
- 哈希碰撞
- 初始容量16
- 数组64节点8个转红黑树
- put方法
- 扩容机制
- get方法

View File

@@ -0,0 +1,23 @@
- [[Set]]接口的实现类
- 底层是 [[HashMap]] 的key
- 遍历
- ((625782a9-c1c2-413d-b1cf-255ecbea27d4))
- {{embed ((625e1ecf-25a9-4b64-8eab-042fd889a062))}}
- forEach遍历
id:: 625f6ab4-5bf2-40bf-a258-8d3d5765361f
{{embed ((625e5ddf-aa2d-4567-8531-3ccc94628ef7)) }}
- [[排序]]
- 借助ArrayList的排序
- ```java
Arraylist<String> arrs = new ArrayList<String>(datas);
Collections.sort(arrs);//升序排序
Collections.reverse(arrs);//反转降序
```
- 去重原理
- 计算hashcode值看集合内是否存在
- 如果存在调用元素上的equals()与对应hash链表上每个元素比较相同则不添加不同就添加
- Java对象特点
- 相同的[[Hash]]值,可能对象不同 Aa和BB
- 相同对象Hash值相同
- HashSet去重
- 元素类重写 [[equals]]和[[hashCode]]

View File

@@ -0,0 +1,2 @@
- 和 [[HashMap]]的区别
- 带 [[synchronized]]关键字

View File

@@ -0,0 +1,45 @@
- ### 执行步骤
- Hello代码
```java
public class HelloWorld{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
```
- 编译步骤
- > [[编译]]:相当于英文书籍的中文翻译,一定会出来一个新的文件
- > [[解释]]:国家领导人参与国际会议,戴的同声传译
- Java是一种半编译,半解释性语言
- [[字节码]]信息,配合JVM虚拟机,就可以做到[[跨平台]]
- Java源代码文件基本结构
- Java程序依靠类来组织自己的代码
- [[类]][[class]]
- **类的类名要跟源代码的文件名保持一致**
- ```java
public class 类的类名{
/*
Java程序中主函数/主入口
一个程序要跑起来,一定要有一个主入口
主函数的结构是固定的
*/
public static void main(String[] arg){
//其它代码
}
}
```
- 比如
- ```java
public class SelfIntroduce{
public static void main(String[] args){
System.out.println("My name is ***")
}
}
```
- **SelfIntroduce** 类名,和文件名保持一致
- **main** 函数方法
- **System.out.println("")** 程序输出方法

20
logseq-java/pages/IDEA.md Normal file
View File

@@ -0,0 +1,20 @@
- [官网地址](https://www.jetbrains.com/idea/)
- 新建项目
- Create-->Java--> Create project from template
Project name
Project location
- Base package三层结构(com.woniuxy.java001)
id:: 6243a9f6-b334-4daf-b1ec-b51335bba244
- com 公司
gov 政府
edu 教育
org 开源
- 公司组织名称
- 项目名称
- 调整字体
- File-->Setting-->Editor-->Font
- 背景设置
- 设置Eclipse快捷键
- ((6241c521-c1c0-4c83-9834-058144ce2e88))
- sout-->System.out.println()
- psvm-->public static void main()

View File

@@ -0,0 +1,9 @@
- [[IDE]]全称Integrated Development Environment(集成开发环境),是用于开发程序的软件
- 常见IDE
- **[[Eclipse]]**
- Myeclipes
- STS
- VS
- **[[IDEA]]**
- 使用最多,太方便,集成大多插件
- [[Java程序注释]]#程序/注释

17
logseq-java/pages/IEDA.md Normal file
View File

@@ -0,0 +1,17 @@
- [官网地址](https://www.jetbrains.com/idea/)
- 新建项目
- Create-->Java--> Create project from template
Project name
Project location
- Base package三层结构(com.woniuxy.java001)
- com 公司
gov 政府
edu 教育
org 开源
- 公司组织名称
- 项目名称
- 调整字体
- File-->Setting-->Editor-->Font
- 背景设置
- 设置Eclipse快捷键
- ((6241c521-c1c0-4c83-9834-058144ce2e88))

View File

@@ -0,0 +1,25 @@
- Java代码执行循序
- 从上至下,从左至右
- 特殊情况
- IF流程控制
- 循环结构
- 方法的调用
- IF流程控制
- [[单分支]]
- ```java
if(布尔表达式){
//语言代码
}
```
- 双分支
- ```java
if(布尔表达式){
//语言代码1
} else{
//语言代码2
}
```
- 双分支的简化写法
- [[三元运算符]]
- [[嵌套判断]]
- [[多分支]]

View File

@@ -0,0 +1,23 @@
- [[Input]]
- 将资源使用流的方式,读取到程序内部
- [[Output]]
- 将资源使用流的方式,从程序内部输出到外部
- 分类
- 流的走向
- 输入流
- 输出流
- 处理单位
- [[字节流]][[byte]]
- [[字符流]][[char]]
- 功能
- 节点流
- 直接面对数据源的流
- 功能流
- 针对节点流进行一次额功能封装的流
- 使用场景
- 上传图片,视频
- 下载文件,视频
- 操作步骤
- 创建流
- 操作流
- 关闭流

3
logseq-java/pages/IP.md Normal file
View File

@@ -0,0 +1,3 @@
- Internet Protocol
- [网际协议](https://zh.wikipedia.org/wiki/%E7%BD%91%E9%99%85%E5%8D%8F%E8%AE%AE)
-

View File

@@ -0,0 +1 @@
- 代表[[IP]]地址

View File

@@ -0,0 +1,6 @@
- [[LocalDate]]
- [[LocalTime]]
- [[LocalDateTime]]
-
- title:: jdk1/8日期api
-

View File

@@ -0,0 +1,35 @@
- 安装JDK
- [下载地址](https://www.oracle.com/java/technologies/downloads/)[[JDK8]]
- 检测java是否安装完成
```
java -version
```
- 编写HelloWorld #HelloWorld
- ```java
public class HelloWorld{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
```
- 编译运行
```
javac HelloWorld.java
java HelloWorld
```
- 如果编译遇到问题
- javac -encoding utf-8 HelloWorld.java
- 配置环境变量
- [[cd命令]]系统命令,任何目录都可运行
- java提升为系统级命令后也可以在任何目录运行
- 变量配置
- [[JAVA_HOME]]:jiava安装目录
- JAVA_HOME
C:\\Program Files\\java\\jre...
- [[Path]]:Java的命令执行目录
- Path
%JAVA_HOME%\\bin
- [[ClassPath]]:配置class字节码文件所在位置
- CLASSPATH
.
-

View File

@@ -0,0 +1,10 @@
- jps
- 显示虚拟机内部进程
- jstat
- 定位虚拟机性能问题
- 检测进程问题查看GC信息
- jstack
- 打印线程快照
- 检测死锁
- jmap
- jconsole

View File

@@ -0,0 +1,2 @@
- Just In Time
- 以方法为单位加快代码解释的效率

View File

@@ -0,0 +1 @@
- JavaScript Object Notation

View File

@@ -0,0 +1,7 @@
- 类加载子系统
- [[类加载机制]]
- [[双亲委派机制]]
- 运行时数据区
- 执行引擎
- 解释器
- JIT编译器

View File

@@ -0,0 +1,22 @@
- JVM虚拟机
-
- (线程)栈,一份方法对应一个栈帧内存区域
- 局部变量表
- 本地变量
- 操作数栈
- 临时存储数据进行运算
- 字节码引擎动态修改
- 动态链接
- 方法放在方法区,存放方法的出口地址
- 方法出口
- 方法结束后运行的地址
- 本地方法栈
- Thread.start()用native修饰的方法
- 本地方法需要的内存空间分配再本地方法栈中
- 程序计数器
- 存储当前执行字节码指令地址native方法为undefined
- 记录当前程序运行位置
- (元空间)方法区
- 解析类信息,常量和静态变量
- 直接内存
- 提高io效率

View File

@@ -0,0 +1,15 @@
- 复制算法
- 需要保留一半空间
- 标记清除
- 标记后清理掉垃圾对象
- 存在内存碎片
- 标记整理
- 标记后将要存活的对象移动到内存的一端
- serial
- serial Old
- parNew
- Parallel
- Parallel Old
- G1
- CMS
- ZGC

View File

@@ -0,0 +1,41 @@
- 为什么要性能调优
- OOM
- Full GC STW
- 调优依据是什么
- 运行日志
- 异常堆栈
- GC日志
- 线程快照
- 堆转储文件dump
- 调优的方向
- 系统硬件配置
- 调优的步骤
- 性能监控
- GC频繁
- CPU
- OOM
- 内存泄漏
- 程序相应时间长
- 性能分析
- 打印GC日志
- 通过工具查看
- jps
- jstat
- OOM快照
- asats
- 性能调优
- 加内存
- 选垃圾回收期
- 优化代码,控制内存使用
- 加机器
- 合理设置线程参数
- 使用中间件
- 如何对性能评估
- 相应时间
- 打开一个网站 几秒
- 数据库查询一条记录(有索引)十几毫秒
- 机械硬盘一次寻址定位 4ms
- 从机械硬盘读取1M数据 2ms
- 从ssd磁盘顺序读取1M数据 0.3ms
- 从内存读取1M数据 十几微秒
- Java程序本地方法调用 几微秒

View File

@@ -0,0 +1,20 @@
- CPU飙高系统反应慢怎么排查
- 关于什么是JVM看看普通人和高手的回答。
- 有没有排查过线上oom的问题如何排查的
- 说一下你对双亲委派的理解
- CPU飙高系统反应慢怎么排查
- 什么是双亲委派?
- JVM 如何判断一个对象可以被回收
- G垃圾收集的特点为什么低延迟
- JVM分代年龄为什么是可以吗
- 一个空Object对象的占多大空间
- 什么是Java虚拟机为什么要使用
- JVM 为什么使用元空间替换了永久代?
- Java 常见的垃圾收集器有哪些?
- 如何破坏双亲委派模型
- JVM 中一次完整的GC流程是怎样的对象如何晋升到老年代
- 如果发生内存泄漏怎么排查
- JVM中的三色标记法是什么
- 说一些CMS垃圾回器的工作原理
- 什么是内存溢出,什么是内存泄漏?
- 什么是双亲委派机制?

20
logseq-java/pages/JWT.md Normal file
View File

@@ -0,0 +1,20 @@
- [[Cookie]]+ [[Session]]
- 保存用户登录状态
- 缺陷
- Cookie不安全信息以明文存储
- Session占用服务器资源横向集群拓展麻烦
- Cookie为浏览器的技术存储空间有限很多前端不再依赖浏览器
- JSON Web Token
- ![image.png](../assets/image_1658140156367_0.png)
- Header
- 声明令牌由JWT技术产生加密技术HS256
- Payload
- 后端需要传输的数据
- Signature
- 说明由谁颁发
- 无法破解
- 执行原理
- 登录 --> Web服务器产生令牌 --> 存Redis有效期30min
- 前端存储在localStorage里还是Cookie或其他数据库与后端无关前端发请求时需要带上Token
- [[axios]]全局拦截器
- [[SpringBoot]]配置拦截器

View File

@@ -0,0 +1,41 @@
- fail-safe 机制与fail-fast 机制分别有什么作用
- HashMap 是怎么解决哈希冲突的?
- 面试官:你能说一下什么是受检异常和非受检异常吗?
- 为什么阿里巴巴的Java开发手册不建议使用Java自带的线程池
- fail-safe 机制与fail-fast机制分别有什么作用
- HashMap是怎么解决哈希冲突的
- JDK动态代理为什么只能代理有接口的类
- 请说一下对象的创建过程(阿里)
- new Stringabc到底创建了几个对象
- 请简单说一下你对受检异常和非受检异常的理解
- HashMap 是如何解决 hash 冲突的?
- String、StringBuffer、StringBuilder 区别
- Integer使用不当导致生产的事故
- 可以讲一下ArrayList的自动扩容机制吗
- 什么是深拷贝和浅拷贝?
- HashMap中的hash方法为什么要右移异或
- HashMap 啥时候扩容,为什么扩容?
- 强引用、软引用、弱引用、虚引用有什么区别?
- Java有几种文件拷贝方式哪一种效率最高
- 聊聊你知道的设计模式
- finally块一定会执行吗
- 在Java 中实现单例模式有哪些方法
- Java SPI是什么有什么用
- Integer和int的区别Java为什么要设计封装类
- Integer aInteger a aa的运行结果
- HashMap 与HashTable 区别
- Java反射的优缺点
- 为什么重写 equals就一定要重写 hashCode方法
- 介绍下策略模式和观察者模式?
- 谈谈什么是零拷贝?
- SortedSet和List异同点
- 为什么阿里Java手册禁止使用存储过程
- 为什么阿里巴巴强制要求使用包装类型定义属性?
- 刚折腾完Log又爆Spring RCE核弹级漏洞
- 钟轻松理解单线程下的HashMap工作原理
- 两个Integer对象比较大小为什么于等于
- 为什么 HashMap会产生死循环
- 哪些情况下的单例对象可能会破坏?
- 责任链模式的实现原理
- new Stringhello之后到底创建了几个对象
- 什么是Java SPI它有什么作用

View File

@@ -0,0 +1,8 @@
- 实体:
- 实体的个体,也就是 [[对象]]
- [[业务对象]]
- [[实体对象]]也称为[[JavaBean]]
- 规范
- 类必须 [[public]]
- 所有属性私有,提供对应 [[getter]] 和 [[setter]]
- 提供 [[有参构造器]] 必须先提供 [[无参构造器]]

View File

@@ -0,0 +1,70 @@
- 乐观锁
- 读多写少写入时进行CAS操作
- 悲观锁
- 写多读少,每一次读写都上锁
- Synchronized ReentrantLock
- 自旋锁
- 自旋空操作,避免线程切换开销
- 等待时间过程会浪费性能
- 可重入锁
- 可以多次获取同一个锁
- ReentrantLockSynchronized
- 申请几把锁需要释放几把锁
- 读写锁
- 读锁
- 允许多个线程同时访问一个资源
- 写锁
- 只允许一个线程获取锁
- 公平锁
- 多个线程按照申请锁的顺序获取锁
- 非公平锁
- 多个线程获取锁的顺序不是一致的
- 线程状态修改需要时间
- 导致线程饥饿
- synchronizedlock通过构造方法修改
- 共享锁
- 和读锁,乐观锁类似
- 独占锁
- 和写锁,悲观锁类似
- 重量级锁
- 依赖操作系统的锁
- synchronized通过监视器monitor实现需要用户态和内核态切换
- 轻量级锁
- 没有竞争时通过CAS操作实现
- 有竞争变为重量级锁
- 偏向锁
- 偏向第一个获取的线程如果没有竞争就不需要进行CAS操作可以直接获取锁
- 如果存在锁及大部分都是竞争的情况下是多余的
- 分段锁
- jdk1.7ConcurrentHashMap有16个segment
- 互斥锁
- 和写锁、悲观锁、独占锁类似
- 同步锁
- 互斥锁、写锁、悲观锁
- 并发执行的多个线程,同一时间只有一个线程可以访问
- 死锁
- 线程持有对方线程需要的自由,又都不释放自己的锁
- 锁粗化
- 扩大加锁的范围,减少加锁的频率减少损耗
- 锁消除
- 如果共享资源没有竞争就消除锁
- 内存逃逸分析
- synchronized
- 实例方法,方法,代码块
- lock
- 接口,可重入锁,悲观锁,独占锁,互斥锁,同步锁
- 需要手动释放
- 发生异常没有主动释放锁很可能会死锁
- 可以让等待锁的线程响应中断
- 可以知道是否成功获取锁
- 实现读写锁提高效率
- ReentrantLock和Synchronized
- 都解决共享变量安全访问的问题
- 可重入锁
- 可见性,原子性
- 手动调用lock和unlock
- 响应中断
- APIJVM
- 公平,非公平
- ReentrantLock通过Condition绑定多个条件
-

View File

@@ -0,0 +1,9 @@
- 继承Thread类
- 不支持多继承
- 不能通过线程池操作
- 实现Runnable接口
- 不方便传参
- 无法获取返回值
- 实现Callable接口
- 可通过Future获取返回值
- 通过Executors创建线程池对象

View File

@@ -0,0 +1,49 @@
- Java起源
- Java是一种高级编程语言
- 1991起源SUN Green小组开发Star 7项目[整合了C++ Lisp SmallTalk](智能家居)
- 1992开发后没市场
- 1993团队面临解散决定Java去走互联网
- 早期叫Oak橡树据说Java之父手詹姆斯·高斯林上爪哇的咖啡
- Java的发展史
- 95/5/23java正式诞生
- 96/1/23JDK1.0
- 97/2/18JDK1.1,此时算是最初级的版本
- 98/12/8JDK1.2milestone version
- 更名为Java2.0
- 确定Java未来的走向
- 1. **J2SE**标准开发桌面应用EclipseIDEA
2. **J2ME**微型手机嵌入式程序Nokia
3. **J2EE**(企业),开发企业级,互联网应用
- 04/10JDK1.5 another milestone
- 1. Java更名Java5.0
2. 提供了注解,枚举,多线程等一系列的新功能或优化功能
- J2SE-->[[Java SE]]
J2ME-->[[Java ME]]
J2EE-->[[Java EE]]
- 2010/4/20SUN被Orcale收购
- 目前最新Java18JDK18
- Java技术组成
- 1. Java编程语言
- 特点
- 1. 简单性:
- 抛弃[[C语言]]头文件,结构体,联合体,[[指针]]等一系列非常复杂的内容
- 前辈多,现任广
- 2. 结构中立:
- Java语言在项目开发中可以和其他任何语言共存
- 3. [[面向对象]]
- 4. 支持[[分布式]]
- 5. 跨平台:
- 一次编写,处处运行
- 6. 高性能
- 7. [[多线程]]
- 8. [[健壮性]],安全性
- 2.Java平台
- [[JDK]]
- Java Development KitJava开发工具包
- JRE+[[API]]工具
- [[JRE]]
- Java Runtime EnvironmentJava运行环境
- JVM+[[核心库]]类
- [[JVM]]
- Java Virtual MachineJava虚拟机
- Java虚拟机出现目的跨平台

View File

@@ -0,0 +1,59 @@
- [[谈谈你对AQS的理解]]
- [[lock和synchronized区别]]
- [[线程池如何知道一个线程的任务已经执行完成]]
- [[什么叫做阻塞队列的有界和无界]]
- [[ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?]]
- [[能谈一下CAS机制吗]]
- [[死锁的发生原因和怎么避免]]
- [[讲一下wait和notify这个为什么要在synchronized代码块中]]
- 你是怎么理解线程安全问题的?
- 什么是守护线程,它有什么特点
- 谈谈你对AQS的理解
- AbstractQueuedSynchronized 为什么采用双向链表
- lock和synchronized 区别
- 线程池如何知道一个线程的任务已经执行完成
- 什么叫做阻塞队列的有界和无界
- ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?
- 能谈一下CAS机制吗
- 死锁的发生原因和怎么避免
- volatile 关键字有什么用?它的实现原理是什么?
- 讲一下wait和notify这个为什么要在synchronized代码块中
- ThreadLocal是什么它的实现原理呢
- 基于数组的阻塞队列 ArrayBlockingQueue 原理
- 怎么理解线程安全?
- 请简述一下伪共享的概念以及如何避免
- 什么是可重入,什么是可重入锁?它用来解决什么问题?
- 请说一下ReentrantLock的实现原理
- 简述一下你对线程池的理解?
- 如何中断一个正在运行的线程?
- 为什么引入偏向锁、轻量级锁,介绍下升级流程
- 什么是守护线程,它有什么特点
- 请谈谈AQS是怎么回事儿
- ReentrantLock 是如何实现锁公平和非公平性的?
- 说一下你对 CompletableFuture的理解
- 线程状态BLOCKED和WAITING有什么区别
- Thread和Runnable的区别
- Thread和Runnable的区别
- AQS为什么要使用双向链表
- ConcurrentHashMap的size方法是线程安全的吗为什么
- wait和sleep是否会触发锁的释放以及CPU资源的释放
- DCL单例模式设计为什么需要 volatile 修饰实例对象
- 讲下线程池的线程回收
- 如果一个线程两次调用start会出现什么问题
- Java 官方提供了哪几种线程池,分别有什么特点?
- 请你说一下你对Happens-Before的理解。
- 线程池是如何实现线程复用的?
- 可以说下阻塞队列被异步消费怎么保持顺序吗?
- 当任务数超过线程池的核心线程数时,如何让它不进入队列,而是直接启用最大线程数
- SimpleDateFormat 是线程安全的吗?为什么?
- 并行和并发有什么区别?
- 如何解决死锁问题?
- 为什么 ConcurrentHashMap中key不允许为null
- ThreadLocal会出现内存泄漏吗
- 什么是CompletableFuture
- 什么条件下会产出死锁,如何避免死锁?
- ConcurrentHashMap是如何保证线程安全的
- ThreadLocal真的会造成内存泄漏吗
- 为什么 ConcurrentHashMap 不允许插入null值
- synchronized和Lock的区别
- 如何安全地中断一个正在运行的线程?

View File

@@ -0,0 +1,38 @@
- 解释某段代码的含义,或废弃某段代码
- 单行注释
- ```java
public class dnahangzhushi {
public static void mian(String[] args) {
//这是一段输出语句
System.out.println("Hello World");
}
}
```
- 多行注释
- ```java
public class duohangzhushi {
/*
*这是一个程序的入口
*程序会从这里执行
*/
public static void main(String[] args) {
System.out.println("Hello World")
}
}
```
- 文档注释
- 使用于类名的上方,描述类的使用
- 使用于方法的上方,描述方法的使用
- ```java
/**
*@auther:YH
*@date:2022/03/38
*/
publc class Hello {
}
```
- 可在代码上加上注释用于执行时跳过代码
- 单行注释快捷键Ctrl+/ #IDEA
- 多行注释快捷键Ctrl+Shift+/ #IDEA
-

View File

@@ -0,0 +1,12 @@
- > Java程序不是运行在系统上,而是运行在了虚拟机上,Java开发团队针对每一种不同的系统开发了不同的虚拟机
- ## Java的跨平台 #JVM
- 一次编写,处处运行
- 一般在Windows上开发代码,而在Linux/Unix操作系统上运行
- 如何做到
- 通过JVM做到
- JVM特点
- 不同操作系统对应不同JVM
- ## JVM内部执行
- [[JIT编译器]]
-
-

View File

@@ -0,0 +1,6 @@
- ((6243be14-7a99-4175-8975-50f29880f478))
- ((62451ad0-4023-43ff-82ad-a114bfb9ac7f))
- ((6246b51d-044b-40fb-aa3c-e057f95915b8))
- ((6246b566-602f-4535-89ad-a88b652bca32))
- ((624d06d6-3d96-4b9b-a60c-cb3e3b285ad0))
- [[互联网企业面试题]]

View File

@@ -0,0 +1,18 @@
- [[ElasticSearch]]的可视化管理工具
- [[Docker]]安装
- ```yml
# PATH /usr/local/config/kibana.yml
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.name: kibana
xpack.monitoring.ui.container.elasticsearch.enabled: true
server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://es:9200"]
i18n.locale: "zh-CN"
```
- ```bash
docker run --name kibana --privileged=true -v /usr/local/config/kibana.yml:/usr/share/kibana/config/kibana.yml --link es:es -p 5601:5601 -d kibana:7.2.1
```

View File

@@ -0,0 +1 @@
- 底层原理和 [[HashMap]]一致LinkedHashMap为双向的

View File

@@ -0,0 +1,10 @@
- 底层为[[链表]]结构
- 每一个元素由三部分[[Node]]构成
- prev
- Element
- next
- [[API]]方法与ArrayList一致
- 与[[ArrayList]]的区别
- 底层结构不一样
- ArrayList比较适合用于查询新增删除节点效率较低
- LinkedList比较适用于新增删除查询效率较低

View File

@@ -0,0 +1,9 @@
- 目录文件操作
- ls
- ls -l
- ll
- ls -
- 操作防火墙
- [[firewall]]
- 解压操作
- [[tar&gz&zip]]

View File

@@ -0,0 +1,4 @@
- 特点
- 元素存储时是有序的
- 元素可以重复
- 每个元素在使用时,都是有下标的

View File

@@ -0,0 +1,4 @@
- 年月日
- 该类默认支持国际化
- 在不同的国际,不同的区域,呈现不同格式的日期
- 默认:yyyy-MM-dd

View File

@@ -0,0 +1 @@
- yyyy-MM-dd-HH-mm-ss

View File

@@ -0,0 +1,3 @@
-
- 时间格式化
- HH代表24小时制

View File

@@ -0,0 +1 @@
- 需要给所有key加一个hash tag {XXX}才能保证所有key落在同一slot

24
logseq-java/pages/MVCC.md Normal file
View File

@@ -0,0 +1,24 @@
- 多版本并发控制
- 为了解决脏读,不可重复读的情况
- 基于Undo版本链接和ReadView来实现的每个事务都有自己的版本号
- MVCC无法解决幻读需要配合锁来实现
- 当前读
- select for update
- select lock in share mode
- insert update delete
- 快照读
- 维护了同一个行的多个版本,查询时会返回对应的事务的修改版本
- 原理
- 隐藏字段
- 行记录trx_id,roll_point
- undo版本链,由当前最新记录+该记录之间的undo日志
- readview
- 决定返回哪个版本的数据,版本链返回规则/可见性算法
- 当前活跃事务id
- 最大事务id +1
- 最小事务id
- readview创建者事务id
- RC和RR下
- RC每一次快照读都会生产readview
- RR只有第一次快照读生成readview后面复用
- MVCC解决了读写阻塞再RR下快照读方面避免了出现幻读的问题

5
logseq-java/pages/Map.md Normal file
View File

@@ -0,0 +1,5 @@
- 映射
- 基于 [[Key-Value]] (键值对)的结构
- 特点
- Key不能重复
- Value可以重复

View File

@@ -0,0 +1,8 @@
- 数学类,提供了一些基本数字运算的方法
- [[random]]
- ((6257ca69-79e2-4267-b04c-8d607cad5a79))
- [[abs]]
- [[pow]]
- [[max]]
- [[min]]
- [[round]]

View File

@@ -0,0 +1,55 @@
- 目录结构
- bin
- data
- include
- lib
- my.ini
- DONE 看面试题
:LOGBOOK:
CLOCK: [2023-10-10 Tue 11:46:55]
CLOCK: [2023-10-10 Tue 11:46:59]--[2023-10-10 Tue 21:24:01] => 09:37:02
:END:
- https://www.bilibili.com/video/BV1N24y1y7a1
- [[如何实现的索引机制]]
- [[表中没有索引会创建B+树吗]]
- [[B+树]]
- [[为什么官方推荐自增主键]]
- [[使用int作为自增主键最大id为10删除10和9添加一条记录不重启和重启后添加记录id为多少]]
- [[索引优缺点]]
- [[回表操作]]
- [[索引类型]]
- [[创建索引的情况]]
- [[索引下推]]
- [[索引失效]]
- [[多个索引是否可以指定]]
- ((65253f94-6e42-488a-9f9f-510ee1d340d7))
- [[Order By是否走索引]]
- [[MySQL查询缓存]]
- [[MySQL组成]]
- [[MySQL执行SQL步骤]]
- [[存储引擎]]
- [[MySQL事务]]
- [[MySQL锁]]
- [[XA协议]]
- [[select for update会产生哪些操作]]
- [[死锁的产生原因和处理方法]]
- [[MySQL日志]]
- MySQL开发
- [[可以用MySQL存储文件吗]]
- [[存储的时候有遇到过什么问题吗]]
- [[财务计算有没有出现过错乱]]
- [[预编译SQL]]
- [[子查询和join哪个效率高]]
- [[SQL调优]]
- [[MySQL数据库cpu飙升]]
- [[分库分表]]
- [[视图]]
- [[存储过程]]
- [[外键]]
- [[processlist]]
- [[千万数据查询优化]]
- [[count(列名)和count(*)区别]]
- [[如果有超大分页怎么处理]]
- [[mysql服务器毫无规律异常重启]]
- [[mysql线上修改表结构有哪些风险]]
- [[什么是mysql多实例部署]]

View File

@@ -0,0 +1,19 @@
- 行锁
- 与表锁不能同时存在
- 表锁
- 锁定一张表
- 读写锁
- 读锁和读锁不互斥,其它情况互斥
- 意向共享锁,意向互斥锁
- 是为了解决如果要添加表锁需要检查是否有行锁的情况,可以根据意向锁判断是否存在行锁
- 意向锁和意向锁之间不会互斥
- 意向共享锁和表级别的读锁之间不互斥,其它会互斥
- 意向锁不会与任何行锁互斥
- 间隙锁
- 锁定的是两个索引之间的间隙,防止新的记录插入到该间隙中,主要是为了解决幻读的问题
- 一个事务读取某个范围的记录,另一个事务再这个范围内插入了新的记录
- 缺点
- 有一定死锁风险,性能影响,添加复杂性,锁定范围可能过大
- 临键锁
- 特殊的间隙锁,只与非唯一索引有关
- 非唯一索引列上都会存在一个临键锁,所著一段左开右闭的区间

View File

@@ -0,0 +1,54 @@
- 数据库操作的最小单元
- 作为一个整体一起向系统提交
- 事务是一组不可拆分的操作集合
- ACID
- 原子性
- 要么都执行,要么都不执行
- 一致性
- 事务执行前后是从一个一致性状态到另一个一致性状态
- 隔离性
- 事务之间互不干扰
- 持久性
- 事务一旦完成修改永久保存
- 并发事务的问题
- 脏读
- 读取到了另一个事务未提交的数据
- 丢失修改
- 一个事务修改了这个数据,但是另一个事务也修改了这个数据,这个时候第一个事务的修改结果就丢失了
- 不可重复读
- 一个事务多次读取同一个数据,读取到的结果不一样
- 幻读
- 一个事务多次查询返回的结果总数不一样
- 避免事务的并发问题
- 配置事务隔离级别
- 读未提交
- 读已提交
- **可重复读**
- 串行化
- 默认情况下使用默认的隔离级别,一致性要求高就使用较高的事务隔离级别
- 靠缓存可以提升事务隔离级别的性能
- 有缓存只能提供高效读,不能保证数据即时一致性,还需要额外开销管理缓存
- 隔离实现方案
- 读写锁
- 锁定读,共享读锁之间不会排斥,写锁会排斥其他锁
- 锁竞争时,要等待其中一个操作释放锁另一个才能获取锁
- 行锁
- 间隙锁
- select lock in share mode
- select lock for update
- insert、update、delete
- MVCC
- 一致性非锁定读
- 隐藏字段
- DB_TRX_ID标记最近一次对本行记录做修改的事务id
- DB_ROLL_PTR回滚指针指向改行的undolog
- DB_ROW_ID没有主键和唯一列时会使用该id生成聚簇索引
- Read View
- 记录和隔离不同事物并发时此纪录哪些版本对当前事务可见
- Undolog
- 回滚数据,读取可见版本的数据
- 一致性、原子性如何实现
- 通过MVCC实现
- 灾备通过redolog实现redolog会记录下来所有修改崩溃后可以通过redolog恢复修改
- 持久性如何实现
- redolog实现事务提交的时候先将所有日志写入日志文件进行持久化即WALwrite ahead log机制

View File

@@ -0,0 +1,5 @@
- DOING 详细理解记忆
:LOGBOOK:
CLOCK: [2023-10-10 Tue 16:49:50]
CLOCK: [2023-10-10 Tue 16:49:59]
:END:

View File

@@ -0,0 +1,15 @@
- 先定位
- 使用top命令查看mysqld的利用率
- 使用show full processlist查看会话
- 观察是哪些sql消耗了资源其中终点观察state指标
- 定位到具体sql
-
- 使用pidstate
- 定位到线程
- 在preformance_schema.thread中记录了thread_os_id找到线程执行的sql
- 根据操作系统id可以到processlist表找到对应的会话
-
- 使用show profile观察sql各个阶段耗时
- 服务器上是否运行了其他程序
- 检查一下是否有慢查询
- pref top

View File

@@ -0,0 +1,50 @@
- 错误日志error log
- 慢查询日志slow query log
- 默认10s
- 手动开启
- 支持将日志写入文件
- 一般查询日志generallog
- 重写日志redolog
- 基于磁盘的数据结构,用来宕机时恢复不完整的数据
- 用于恢复更新了内存但是还没有刷入硬盘的数据
- 回滚日志undolog
- 回滚到某一版本,是一种逻辑数据
- 记录修改之前的数据delete对应一条insert数据
- 提供mvcc下的读取
- 二进制日志binlog
- 记录增删改时的sql当前时间系统相关记录的日志修改了内容就会产生一条bin log
- 进行主从复制,数据库的恢复
- 是否实时写入磁盘
- binlog
- sync_binlog
- 0,写入页缓存,操作系统决定刷盘,有丢失日志风险
- 1每次提交事务都写入磁盘
- NN个事务后写入磁盘
- redolog
- undolog
- **innodb_flush_log_at_trx_commit**
- 0每秒写入磁盘
- 1每次提交调用fsync刷新IO缓存
- 2每次都把redolog写入page cache由系统接管什么时候写入磁盘
- 时机顺序
- DOING 补充笔记
:LOGBOOK:
CLOCK: [2023-10-10 Tue 17:58:30]
CLOCK: [2023-10-10 Tue 17:58:34]
CLOCK: [2023-10-10 Tue 17:58:34]
:END:
- redolog和binlog的两阶段提交
- binlog有几种录入格式
- statement
- 不记录数据变更只记录sql语句和每一行数据变化
- row
- 不记录sql语句上下文信息记录数据被修改修改成什么样
- mixed
- 有函数用row没函数用statement无法识别系统变量
- 集群同步为什么使用binglog
- binglog是mysql提供的日志所有存储引擎都可以使用
- 支持增量同步
- 可以供其他中间件读取hdfs
- 复制表数据
- 不支持某个阶段回放
- 复制过程中断很难确定复制的offset

View File

@@ -0,0 +1,14 @@
- MySQL支持缓存查询吗
- 5.7支持内部缓存8.0之后就废弃了
- 通过哈希值计算,命中缓冲区就会返回缓冲区结果
- 为何废弃
- 缓存限制
- mysql没有灵活管理缓存失效和生效尤其对于频繁更新的表
- SQL必须完全一致才会命中
- 为了节省内存太大的result不会缓存
- 在分库分表情况下不起作用
- 执行SQL里有触发器自定义函数时缓存不起作用
- 表结构或数据改变时,基于该表的缓存立即失效
- 替代方案
- redis
- ehcached

View File

@@ -0,0 +1,8 @@
- 含有计算以及函数的情况
- like以%和_开头匹配的情况
- 不等于
- is null和is not null
- 如果有字段为null尽量使用is null判断如果null比较高优化器也会使用索引进行范围查询
- 存在类型转换
- 复合索引不满足最左前缀
- mysql认为全表扫描快

View File

@@ -0,0 +1,20 @@
- 客户端
- JDBC,SQLyog
- 服务器
- 连接层
- 处理连接TCP连接分配线程
- 服务层
- SQL接口
- Parser解析器
- 语法分析
- Optimizer查询优化器
- Caches&Buffers查询缓存组件
- 引擎层
- InnoDB
- MyISAM
- 存储层
- 所有数据、数据库、表的定义、表内容、索引都存在文件系统,以文件存在,并完成与存储引擎的交互
- MySQL提示“不存在此列”是执行到哪个节点报出的
- Parser解析器分析sql语法时检查的列
- 一个表创建了多个索引,在哪个阶段进行索引选择?
- Optimizer优化器阶段查询优化器

View File

@@ -0,0 +1,9 @@
- 频繁where条件查询
- 需要排序和分组的字段,
- 需要统计的字段
-
- 不适合创建
- 频繁更新的
- 排序where分组用不到的字段
- 已经确定表中数据非常少
- 需要参与函数计算

View File

@@ -0,0 +1,19 @@
- 表锁和行锁的区别
- 表锁
- 串行化时,整个表加锁,锁住整个表
- 行锁
- 非串行化时InnoDB使用的是行锁只锁一行数据
- 通过mvcc完成的
- 共享锁
- 排他锁
- 意向锁
- 所有操作之前都要申请一个意向锁,属于表锁,意向锁之间不会冲突,会和表锁冲突
- 意向共享锁
- 意向排他锁
- 间隙锁
- 锁定多行数据
- next-key锁
- 避免一些幻读操作
- 当前读和快照读
- 锁定读的时候读到的最新版本的数据
- 可重复读下mvcc生效的是快照读读取数据快照

View File

@@ -0,0 +1,6 @@
- 说一说Mybatis里面的缓存机制
- 说一说Mybatis里面的缓存机制
- Mybatis中0的区别是什么
- Mybatis是如何进行分页的
- MyBatis 配置中的0和0有什么区别
- MyBatis 何时使用一级缓存,何时使用二级缓存?

View File

@@ -0,0 +1,12 @@
- ```java
//读取Mybat配置文件
InputStream mybatisConfigInputStream = Resources.getResourceAsStream("mybatis-config.xml");
//创建sqlsession会话工厂
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//一个数据库 对应一个会话工厂
SqlSessionFactory factory = factoryBuilder.build(mybatisConfigInputStream);
//获取会话 会话用来执行sql语句,提交,回滚事务
SqlSession sqlSession = factory.openSession();
//关闭session
sqlSession.close();
```

View File

@@ -0,0 +1,43 @@
- innoDB 如何解决幻读
- b树和b树的理解
- 你是否在面试中也被过MySQL优化相关的问题呢
- 关于“你对MVCC的理解看看普通人和高手是如何回答这个问题的
- 关于索引的底层实现为什么选择BTree而不是红黑树
- 请你说一下Mysql中的性能调优方法
- 为什么一线互联网公司严禁使用存储过程?
- Mysql 中的RR隔离级别到底有没有解决幻读问题
- 为什么索引要用B树来实现呢而不是B树
- Mysql是如何解决幻读问题的
- 什么是聚集索引和非聚集索引
- 请你简单说一下Mysql的事务隔离级别
- binlog 和 redolog有什么区别
- 说一下你日常工作中是怎么优化SQL的
- Mysql 主从集群同步延迟问题怎么解决
- MySQL 数据库 cpu 飙升的话,要怎么处理呢?
- innoDB 如何解决幻读
- Mysql的binlog 有几种格式?分别有什么区别
- 索引有哪些缺点以及具体有哪些索引类型
- b树和b树的理解
- 什么是聚集索引和非聚集索引
- 请你简单说一下Mysql的事务隔离级别
- Mysql为什么使用BTree作为索引结构
- 数据库连接池有什么用?它有哪些关键参数?
- 请说一下Mysql索引的优点和缺点
- Mysql事务的实现原理
- 请你说一下数据库优化
- 说一下你对行锁、临键锁、间隙锁的理解
- 索引什么时候失效?
- Mysql 如何解决幻读问题
- 请简要说明Mysql中MyISAM和InnoDB引擎的区别
- 存储MD值应该用VARCHAR还是CHAR
- Mysql 索引在什么情况下会失效
- MySql 存储引擎 InnoDB 与MyISAM 有什么区别
- MVCC过程中会加锁吗
- MySQL update 是锁行还是锁表?
- 为什么 SQL 语句不要过多的join
- 什么情况下不建索引?
- 为什么MySQL索引结构采用B
- 谈谈你对MySQL事务隔离级别的理解
- 为什么SQL语句命中索引比不命中索引要快
- B 树和B树的区别什么
- 执行SQL响应比较慢你有哪些排查思路

Some files were not shown because too many files have changed in this diff Show More