MySQL技术内幕
MySQL体系结构和存储引擎InnoDB体系架构InnoDB存储引擎的架构。图2-1简单显示了InnoDB的存储已引擎的体系架构,从图可见,InnoDB存储引擎有多个内存块,可以认为这些内存块组成成了一个大的内存池,负责如下工作:
维护所有进程/线程需要访问的多个内部数据结构。
缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存。
重做日志(redolog)缓冲。
后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证正在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
后台线程1、Master Thread
MasterThread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插人缓冲(INSERT BUFFER)、UNDO页的回收等。
2、IO Thread
在InnoDB存储引擎中大量使用了AIO(AsyncIO)来处理写I0请求,这样可以极大提高数据库的性能。而IO Thread的工作主 ...
MySQL事务应用和原理
MySQL架构
网络连接层
客户端连接器(Client Connectors):提供与MySQL服务器建立的支持,它们通过各自API技术与MySQL建立连接。
服务层(MySQL Server)服务层是MySQL Server的核心,主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分。
1234561. 连接池(Connection Pool):负责存储和管理客户端与数据库的连接,一个线程负责管理一个连接。[官网性能测试报告:引入线程池,性能稳定性与性能会有很大得提升,128并发,读写模式, mysql高出60倍,只读18倍,若不引用线程池,线程创建关闭性能消耗大]2. 系统管理和控制工具(Management Services & Utilities):例如备份恢复、安全管理、集群管理等3. SQL接口(SQL Interface):用于接受客户端发送的各种SQL命令,并且返回用户需要查询的结果。比如DML、DDL、存储过程、视图、触发器等。4. 解析器(Parser):负责将请求的SQL解析生成一个"解析树" ...
CompletableFuture学习
前期准备12345678/** * 定义线程池 */public static ExecutorService service = Executors.newFixedThreadPool(5);private static String getThreadInfo() { return " 线程: " + Thread.currentThread().getName() + "_" + Thread.currentThread().getId();}
启动异步任务1、runAsync 无入参、无返回值
123456789101112131415/** * runAsync:无入参、无返回值 * Executor为空,则采用默认的ForkJoinPool.commonPool线程池,否则使用自定义的ThreadPool * @throws ExecutionException * @throws InterruptedException */private static void one() thro ...
Head First设计模式
设计模式入门OO基础
抽象、封装、多态、继承
OO原则
封装编号,
多用组合少用继承
针对接口编程,不针对实现编程
“针对接口编程”真正的意思是“针对超类型(supertype)编程”。
这里所谓的“接口”有多个含义,接口是一个“概念”,也是一种Java的interface构造。你可以在不涉及Java interface的情况下,“针对接口编程”,关键就在多态。利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。“针对超类型编程”这句话,可以更明确地说成“变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时的真正对象类型!”
策略模式策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
应用示例,我们现在都有超类Duck,具有共同的特征会 ...
分布式工具类
分布式时间戳确保雪花Id唯一性的关键点就在于机器码。
Snowflake的机器码workerId默认由本机IP和进程Id计算得到,各取末尾5位移位后拼在一起。因此,局域网内不同机器,或者相同机器的不同进程,其机器码基本上不会相同。在多网段局域网,或者跨机房场景,机器码有一定可能性相同。机器码加入进程Id,避免某个应用在同一台服务器上多实例部署时得到相同workerId。如果要求绝对不相同的机器码,可通过手工设置唯一workerId的方式来实现。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ThreadFactory;import jav ...
内存泄漏问题排查
线程池导致内存泄漏问题排查
查询arms的应用详情发现老年代一直在缓慢增长,且线程数Waiting高达3.6k
使用阿里云在线创建内存快照,或者使用jamp -dump命令
1jmap -dump:live,format=b,file=heap.bin pid
PS: 重要的服务需要先下线,再去dump,否则此服务期间可能接口异常。比如service服务我们可以把需要dump的容器在nacos上下线,再去dump。
将下载的dump文件使用idea的Profiler/Eclipse工具分析
查看Leak Suspects,发现存在线程导致的内存泄漏
然后再看大对象,发现Thread对象数高达1801个
查看其GC引用,可看出线程池存在问题
进入容器使用jstack 1查看线程快照信息
12345678910111213141516171819202122232425"pool-663-thread-1" #113206 prio=5 os_prio=0 tid=0x00007f9b902df800 nid=0x1ba27 wa ...
Cassandra学习
安装1、下载
1打开官网,选择下载频道 https://cassandra.apache.org/download/
2、新建数据存储目录,data目录
123# 如果不配置数据目录默认为$CASSANDRA_HOME/data/data;data_file_directories: - D:\coding-software\apache-cassandra-3.11.11\data
3、新建日志目录,commitlog目录
123# 如果不配置日志目录,默认为:$CASSANDRA_HOME/data/commitlog;commitlog_directory: - D:\coding-software\apache-cassandra-3.11.11\commitlog
4、新建缓存目录,saved_caches目录
12# 如果不配置日志目录,默认为:$CASSANDRA_HOME/data/saved_caches;saved_caches_directory: D:\coding-software\apache-cassandra-3.11 ...
Seata分布式事务
1.什么是分布式事务要了解分布式事务,必须先了解本地事务。
注:本学习参考B站-分布式事务全攻略:2小时搞懂分布式事务
1.1.本地事务本地事务,是指传统的单机数据库事务,必须具备ACID原则:
原子性(A)
所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。
一致性(C)
事务的执行必须保证系统的一致性,在事务开始之前和事务结束以后,数据库的完整性没有被破坏,就拿转账为例,A有500元,B有500元,如果在一个事务里A成功转给B50元,那么不管发生什么,那么最后A账户和B账户的数据之和必须是1000元。
隔离性(I)
所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。数据库保证隔离性包括四种不同的隔离级别:
Read Uncommitted(读取未提交内容)
Read Committed(读取提交内容)
Repeatable Read(可重读)
Serializable(可串行化)
持久性(D ...
Spring实战-第四版学习
JVM调优
参数
含义
-Xms2G -Xmx2G
代表jvm可用的heap内存最小和最大
-XX:PermSize -XX:MaxPermSize
代表jvm的metadata内存的大小
1、启动报的错是:Could not reserve enough space for object heap error
1-Xms512M -Xmx1024M
2、Jvm out of memroy 报错总结:
Java heap space: 增加-xmx
PermGen space: 增加-XX:PermSize
Requested array size exceeds VM limit: 错误的意思是创建数组的大小超过了heap的最大大小,所以解决办法就是,要么增加-xmx,要么减小要创建的这个数组大小。
简化Java开发依赖注入任何一个有实际意义的应用(肯定比 Hello World 示例更复杂)都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这将会导 ...
ElasticSearch学习
入门简介Elasticsearch是一个基于Lucene库的开源搜索引擎,它提供分布式的实时文件存储和搜索,可扩展性好,并且支持通过HTTP网络接口交互,数据以JSON格式展示。
Elasticsearch因为其极快的搜索和聚合速度通常被应用在各种搜索应用中,比如在自己的app里面加一个搜索框或者分析实时日志(ELK系统)。
Elasticsearch会对所有输入的文本进行处理,建立索引放入内存中,从而提高搜索效率。在这一点上ES要优于MySQL的B+树的结构,MySQL需要将索引放入磁盘,每次读取需要先从磁盘读取索引然后寻找对应的数据节点,但是ES能够直接在内存中就找到目标文档对应的大致位置,最大化提高效率。并且在进行组合查询的时候MySQL的劣势更加明显,它不支持复杂的组合查询比如聚合操作,即使要组合查询也要事先建好索引,但是ES就可以完成这种复杂的操作,默认每个字段都是有索引的,在查询的时候可以各种互相组合。
为了省事,以下统一用ES来代替Elasticsearch,其实我们在公司里面也基本都说ES,全称比较难读。还有一点,因为ES使用了Lucene的库,下面说的很多优 ...