- 博客(26)
- 收藏
- 关注
原创 Innodb存储引擎原理(一)
MySQL概述当启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例。如果没有配置文件会按照编译时默认参数设置启动实例。用以下命令可以查看当mysql数据库实例启动时,会在哪些位置查找配置文件。mysql --help | grep my.cnf可以看到MySQL数据库按/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/my.cnf的顺序读取配置文...
2021-11-01 10:13:33 597
原创 Spring Cloud源码阅读(一)
问题Spring Cloud如何创建两个上下文环境的 Spring Cloud如何加载bootstrap.yml配置文件的 Spring Cloud Config是如何获取远程配置的 Spring Cloud多个环境配置项重复优先级问题源码解析Spring Cloud如何创建两个上下文环境的org.springframework.cloud.bootstrap.BootstrapApplicationListener该类执行了创建Spring Cloud父级上下文的创建。/**
2021-09-04 18:26:27 2106
原创 Spring Boot源码阅读(二)
SpringBoot源码阅读(一) /** * Run the Spring application, creating and refreshing a new * {@link ApplicationContext}. * @param args the application arguments (usually passed from a Java main method) * @return a running {@link ApplicationContext}
2021-02-28 21:51:07 289 1
原创 Spring Boot源码阅读(一)
@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}这是一个标准的SpringBoot应用。main方法中调用了org.springframework.boot.SpringApplication#run(java.lang.Class<?.
2021-02-11 18:09:26 489 2
原创 Tomcat源码阅读(三):Catalina启动类
org.apache.catalina.startup.Bootstrap是tomcat的启动类,即入口类。而实际上Tomcat的启动是通过org.apache.catalina.startup.Catalina来执行的,Bootstrap类只是一层代理,通过反射的方式来调用Catalina的start()方法。接下来让我们看看看Catalina类start()方法具体做了哪些操作。 /** * Start a new server instance. */ pu
2020-09-21 23:14:54 1040
原创 Tomcat源码阅读(二):Bootstrap类和类加载机制
org.apache.catalina.startup.Bootstrap是tomcat的启动类,即入口类。我们通过这个类作为入口来研究Tomcat源码。首先来看这个类的静态代码块。static { // Will always be non-null String userDir = System.getProperty("user.dir"); // Home first String home = System.getPr
2020-07-27 20:02:36 290
原创 Tomcat源码阅读(一):IDEA导入tomcat9
下载地址:https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.36/src/apache-tomcat-9.0.36-src.tar.gz解压后,创建home文件夹,将webapps以及conf目录移至home目录下。使用idea打开,并在根目录下创建pom.xml文件(tomcat原来是使用ant构建的,现改为maven构建)<?xml version="1.0" encoding="UTF-8"?><project
2020-07-03 14:29:06 475
原创 JDK源码研究(七):ThreadPoolExecutor
该类就是我们常用的线程池实现类,Executors中构建的几种线程池大部分都是该类的实例,只不过其构造的参数不同而已。我们可以先来看下他的内部属性。上面截图中记录了一个ctl的AtomicInteger对象,一个储存int的原子对象。该对象非常的精妙,使用了高三位来储存线程池的状态,具体的状态如下下面的常量所示,分别表示:1、RUNNING(1) 状态说明:线程池处在RUNNI...
2019-09-30 15:36:08 166
转载 mysql索引 B+ Tree和Hash的区别
在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议。B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。简单地说,哈...
2019-06-27 21:01:45 1009
转载 MySQL- InnoDB锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题。下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题。背景知识事务(Transaction)及其ACID属性事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。...
2019-06-18 17:01:52 125
原创 JDK源码研究(六):AtomicInteger
AtomicInteger继承了Number类,Integer也继承了该类,主要定义了一些转换成其他数值型类的方法,如Double、Long、Float等。其内部属性比较少,第一个Unsafe类是rt.jar包下的一个类,这里主要用于获取其内部属性value的内存偏移值和做一些CAS操作。unsafe用的是单例模式,且只有BootstrapClassLoader类加载器才能获取该单例。...
2019-06-17 17:29:06 218
原创 JDK源码研究(五):AbstarctList ArrayList LinkedList
首先看下两个类继承关系上的差异,都实现了List接口,这也是我们平时常用到的,都实现了Cloneable接口,说明两个类都是可以调用clone()方法的,否则会抛出一个CloneNotSupportedException异常,以及都实现了Serializable接口,可以实现序列化。不同的地方在于,ArrayList继承AbstractList抽象类,而LinkedList继承的是Ab...
2019-06-13 15:32:36 159
原创 JDK源码研究(四):ThreadLocal类
ThreadLocal没有继承任何其他类(默认继承Object类),类的属性也比较少。threadLocalHashCode是该类用ThreadLocalMap中获取value时使用的散列值。具体的生成方法如下:可以看出,它是在上一个被构造出的ThreadLocal的threadLocalHashCode的基础上加上一个魔数0x61c88647的。这个魔数的选取与斐波那契散列有关...
2019-06-11 18:32:55 204
原创 Mybatis Plus:sql查询字段被切断问题,ORG_ID被解析成G_ID
使用mybatis plus的通用查询,即使用QueryWrapper进行查询的时候,发现ORG_ID这个字段放在第一位查询的情况下总是解析成G_ID,直接上图,跟踪源码发现拼凑的SQL,问题就在prefixOverriders="AND|OR",也就是说where后面当开头为AND或者OR的时候就会被覆盖为空,所以当where ORG_ID = #{}的时候就会被解析成G_ID=#{}...
2019-06-04 14:42:24 1462
原创 JDK8源码研究(三):Thread
首先来看Thread类的继承关系,比较简单,只实现了Runable接口,该接口定义了线程具体的执行任务的run()方法。然后定义了一个类的内部的静态代码块,保证registerNatives()方法在类初始化时候能最先执行。接下来我们看下该类的属性,可以看到一些熟悉的属性,如name记录的是该线程实例的线程名,priority记录的是该线程的优先级,daemon记录该线程是否为守护...
2019-06-02 18:18:46 586
原创 JDK8源码研究(二):AbstractStringBuilder StringBuilder StringBuffer
首先来看AbstractStringBuilder,实现了CharSequence,该接口也是String的接口,定义了字符串的方法,还有Appendable接口,该接口定义了append方法以及几个append方法的重载。再来看AbstractStringBuilder类的私有属性,和String类比较相近,比String少了个hash属性,AbstractStringBuilder类没有重...
2019-05-24 17:26:56 327
原创 JDK8源码研究(一):java.lang.String
首先看官方的注释:大致的意思是,这个String类代表了字符串,所有的JAVA程序设计中的字符串的字面常量,例如"abc",都是这个类的实例。String类是常量,他的值在创建以后就无法更改,String buffers支持可变的字符,因为String是不可变的所以他们可以用于共享。例如:String str="abc"和 char data[] = {'a','b','c'}; String...
2019-05-23 20:08:21 546
原创 For input string: 1 异常处理
当使用Integer.value("1")的时候却发现抛出了一个NumberFormatException异常,提示信息是For input string: "1",百思不得其解,后来打断点调试发现,“1”这个字符串中居然有两个char字符,第一个为“\ufeff”,网上查资料才明白,因为我这个“1”是从文本中使用inputStream读入的,而文本的保存编码为UTF-8,重点在于windows默...
2019-05-16 15:51:14 11438 1
原创 阅读Spring Boot官方文档的一些笔记(一)
现在Spring Boot最新的版本为2.1.3。配置信息跟Spring一样,使用@Configuration注解的类来实现,可以使用@Import注解导入其他的配置类,但配置信息必须在@ComponentScan的扫描范围内才能生效,Spring Boot的@SpringBootApplication中引用了该注解,会扫描当前包以及子包下的所有Spring组件,包括@Configurat...
2019-03-10 14:45:11 288 1
原创 二叉树 B-TREE B+ TREE特征理解
二叉查找树查询的时间复杂度是O(logN),查找速度最快和比较次数较少。但用于数据库索引,当数据量过大,不可能将所有索引加载进内存,使用二叉树会导致磁盘IO过于频繁,最坏的情况下磁盘IO的次数由树的高度来决定。B-TREE对二叉树进行了横向扩展,使树结构更加矮胖,使得一次IO能加载更多关键字,对比在内存中完成,减少了磁盘IO次数,更适用于大型数据库,但是为了保持自平衡,插入或者删除元素都会导致...
2019-02-27 17:27:53 746
原创 @RequestBody Unrecognized field异常原因
首先引发该异常的原因是 SpringMVC解析前端传入的json格式的参数使用jackson转换为JAVA类的时候,参数中包含JAVA对象中没有的属性导致了异常。可以在目标对象上加上@JsonIgnoreProperties(ignoreUnknown = true)注解,并配置ignoreUnknown = true,则Jackson在反序列化的时候,会忽略该目标对象不存在的属性。或者全...
2019-02-26 14:02:29 5189
原创 Mybatis plus逻辑删除失败的BUG
开发调试的时候发现Mybatis Plus的逻辑删除失效了,看了下配置文件发现没有问题,通过查看以下源码发现逻辑删除需要注入的bean,查看这个bean的源码如下查看其中一个实例的类的源码,如通过ID逻辑删除LogicDeleteById的源码,如下mp在项目启动时预加载SQL是通过TableInfo中logicDelete字段判断是否开启逻辑删除的。然后让我们来看看mp内部是...
2018-10-15 17:37:53 8820 2
原创 JAVA1.8新特性 编译添加参数名
项目中遇到一个功能需要通过反射运作,并且需要获取到反射的方法中具体的参数名,查看API看到java.lang.reflect.Parameter类中提供了getName()方法,通过调用结果获取到的是args0,args1之类,查看源码内容如下java 8可以通过编译器时候-parameters参数开启,也可以在maven的pom文件中添加...
2018-09-14 15:55:30 1108
原创 关于Redis设计与实现的一些笔记
1.简单动态字符串(SDS) 在C语言原有的字符串基础上添加了记录字符串长度和空闲长度信息和空间预分配的处理。 记录字符串长度信息,获取字符串长度时间复杂度为O(1)。 杜绝缓冲区溢出,通过拼接字符串前判断SDS是否有足够的内存分配空间,如果不足先进行扩容后再进行字符串拼接。 空间预分配和惰性空间释放减少修改字符串时带来的内存重新分配次数。 二进制...
2018-09-14 15:40:18 115
原创 深入了解JVM的一些笔记
Java虚拟机 64位虚拟机相对于64位虚拟机性能下降的主要原因: 指针膨胀和各类数据的类型补白导致消耗更多的内存,消耗的内存大概在10%~30%之间. 64位虚拟机运行速度落后于32位虚拟机,网上查了下大概是寄
2017-07-26 11:48:46 189
原创 spring MVC给微信公众号提供第三方服务被动回复
首先配置开发者接口配置,URL为你服务器接受微信接口发送过来的数据后台链接,如我的服务器地址为123.206.178.199,端口号为80,后台URI为/wechat.do,则URL就为http://123.206.178.199:80/wechat.do,该请求为get请求,在URL后面需要加上Token进行验证,Token的值为下面Token用户自己填写,如我的Token为token,则需
2017-05-24 10:23:48 702
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人