自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

是狮不是猿

打工人 好好学习 天天向上 有空就学学Java

  • 博客(22)
  • 收藏
  • 关注

原创 ElasticsearchRestTemplate entity content is too long 最大字节长度限制修改

依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>报错Caused by: org.apache.http.ContentTooLongException: entity content is to

2021-04-20 00:05:56 5660 11

原创 Collections.synchronizedList和CopyOnWriteArrayList的选择

背景在多线程环境下ArrayList是线程不安全的,所以需要使用线程安全的List,我第一时间使用的是Collections.synchronizedList(new Arraylist<>()),但是在实际使用过程中却发生了安全事件。测试当前存在一个类IntegerList,该类对象在多线程环境中添加元素和获取获取public class IntegerList { final private List<Integer> integerList; pub

2021-04-15 17:12:47 906

原创 解析JDK1.7 HashMap 头插法生成的环形链表死循环问题

背景在JDK1.7中HashMap使用头插法来添加同一位置上的节点,但是在并发的情况下使用HashMap,在进行resize()扩容的过程中,链表可能会形成环状,当在读取HashMap元素的时候会出现死循环,CPU占用标高,服务器崩溃的问题。扩容前正常 resize() 后并发 resize() 形成环状在下面我会说明是如何生成该环状正常扩容resize()的过程以下执行的过程是在同一链表元素的key值rehash后落到同一坐标上为基础我们需要关注的是HashMap的resize()方

2021-03-25 19:02:04 5442 3

原创 Spring循环依赖图解

循环依赖的情况如下所示A依赖B,B依赖A,形成了循环的依赖class A { B b; }class B { A a; }在Spring中AOP是很常用的,被AOP切入的Bean,最后生成的是被代理的BeanSpring解决循环依赖的前提Bean是单例的不全是构造器注入Bean循环依赖的三级缓存我们都知道Spring使用了三级缓存来解决了循环依赖,但是他们的具体流程必须要懂获取Bean的过程所有的Bean的获取都是通过BeanFactory中的getBean

2021-03-17 17:17:41 482

原创 TCP 三次握手 四次挥手

三次握手三次握手过程描述第一次握手: 客户端发送syn标志位和seq num,向服务器申请建立连接,客户端状态由closed变为syn_send第二次握手: 服务端返回 syn和ack标志位,ack num以及seq num,确认第一次握手的报文段,返回ack num=seq num(第一次握手发送的)+1,同意建立连接,服务器状态由listen变为syn_received第三次握手: 发送确认报文段,返回ack以及ack num=seq num(第二次握手发送的)+1,客户端状态变为:es

2021-03-08 16:25:07 14275 7

原创 Srping MVC处理HTTP请求过程

背景首先,我们要知道通过HTTP请求访问Java后端程序,其实就是访问Servlet,我们编写的Servlet程序部署在实现了Servlet规范的Java Web服务器上,比如我们最常用的Tomcat服务器,它会接收浏览器发过来的HTTP请求,然后将请求转发到对应的Servlet中,在Servlet中对请求进行业务逻辑处理后,将结果返回。Servlet的访问过程访问顺序如下: Tomcat->ApplicationFilterChain->Filter-1->Filter-2-&gt

2021-01-28 00:00:55 149

原创 Spring MVC初始化过程-源码解析

背景在SpringMVC项目配置中,我使用了xml的方式来启动SptingMVC对声明式注解的支持,其中使用如下标签进行启动<!--支持注解方式声明@Controller--> <mvc:annotation-driven />因为解析配置文件过程中,需要对其中的标签进行解析,而这里使用的是自定义标签,则需要有对应相关的处理器和解析器标签解析过程 <mvc:annotation-driven />解析自定义标签MvcNamespaceHandler因

2021-01-25 11:11:52 197

原创 Spring MVC项目配置

背景现在流行使用SpringBoot项目来开发Web项目,只要添加以下依赖即可拥有开箱即用的SpringMVC的开发环境。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency&g

2021-01-16 22:53:45 276

原创 Spring事务执行过程-TransactionInterceptor-源码解析

背景因为Spring声明式事务是通过AOP增强实现的,所以现在具体来分析一下Spring事务的执行过程,因为AOP是通过拦截器执行链实现的,所以我们可以把关注点聚焦在拦截器上-TransactionInterceptor事例 @Transactional public void insertUser(String name,int age){ userMapper.insertUser(name,age); } @Test public void

2021-01-13 23:28:21 773

原创 Spring事务传播级别REQUIRED和NOT_SUPPORTED测试

背景Spring为了让在同一个方法下处理不同的事务,于是有了事务传播级别REQUIRED当前线程没有事务,会新建一个事务,如果存在事务,则使用该事务NOT_SUPPORTED当前线程存在事务,挂起当前事务,执行完后,恢复挂起的事务事例测试同一个声明式事务下的REQUIRED和NOT_SUPPORTEDTestPropagationpublic class TestPropagation { private UserService userService; /**

2021-01-12 18:42:05 13688 6

原创 Spring事务的启动过程-源码解析

背景Spring使用声明式让我们无需关系事务的复杂逻辑处理,只要添加注解@Transactional即可为业务添加事务支持如何启用Spring事务注解方式@EnableTransactionManagement还需要加@Configuration使用注解方法启动必须使用基于注解的容器启动,这里就不列出例子了 //基于注解的容器 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(

2021-01-08 10:11:49 234

原创 Java内存区域

运行时区域程序计数器线程私有,各线程计数器互不影响,独立存储。程序计数器是一块较小的空间,它可以看作是当前线程所执行的字节码的行号指示器(地址)。在虚拟机的概念模型里,字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。如果执行的是native方法,这个计数器的值为空Java虚拟机栈线程私有的,生命周期与线程相同。虚拟机栈描述的是Java方法自行的内存模型:每个方法在执行的同时都会创建一个栈

2021-01-06 18:45:36 92

原创 Redis基本数据类型

五种数据类型string数据结构内部结构为字符串数组最大容量521MB实现原理类似java的ArrayList,采用预分配容量的方式,一般分配的capacity要高于实际字符串的长度len。当字符串小于1MB时,扩容是加倍现有的空间。如果字符串长度超过1MB,扩容时每一次只增加1MB。需要注意的是字符串最大长度为512MB。命令set name ‘xiaobai’get namemset name1 ‘xiaobai’ name2 ‘xiaohei’mget name1 name2

2021-01-06 18:43:11 143

原创 MySQL服务器配置优化

背景MySQL有大量可以修改的参数-但不应该随便去修改。通常只需要把基本的项配置正确, 应该将更多的时间花在schema的优化、索引,以及查询设计上MySQL配置的工作原理配置文件位置/etc/my.cnf/etc/mysql/my.cnf配置文件通常分成多个部分,每个部分的开头是一个用方括号括起来的分段名称,MySQL程序通常读取跟它同名的分段部分,许多客户端程序海水读取client部分,这是一个存放公用设置的地方。服务器通常读取mysqld这一段。一定要确认配置项放在了文件正确的分段

2021-01-06 18:41:38 197

原创 MySQL字符集

字符集和校对字符集是指一种从二进制编码到某类字符符号的映射,可以参考如何使用一个字节来表示英文字母。“校对”是指一组用于某个字符集的排序规则。MySQL4.1和之后的版本中,每一类编码字符都有其对应的字符集和校对规则。MySQL对各种字符集的支持非常完善,但是这也带来了一定的复杂性,某些场景下甚至会有一定的性能牺牲。MySQL如何使用字符集每种字符集都可能有多种校对规则,并且都有一个默认的校对规则。每个校对规则都是针对某个特定的字符集,和其他的字符集没有关系。校对规则和字符集总是一起使用的,所以后面我

2021-01-06 18:40:43 90

原创 MySQL查询性能优化

为什么查询速度会慢如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定时间。如果想优化查询,实际上要优化其子任务,要么消除其中一些任务,要么减少任务的执行次数,要么让子任务运行得更快。查询的生命周期从客户端到服务器,然后在服务器进行解析,生成执行计划,执行,执行可以是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。慢查询基础:优化数据访问查询性能低下最基本的原因是访问的数据太多确认应用程序是否在检

2021-01-06 18:38:54 243

原创 MySQL索引

前言索引是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能可能还不明显,但当数据量逐渐增大时,性能则会急剧下降。索引优化应该是对查询性能优化最有效的手段了。索引基础要理解索引工作的原理,就好比你看一本书,你会先看书的目录,然后找到对应主题的页码,再根据页码翻到指定的页。索引的类型索引有很多种类型,可以为不同的场景提供更好的性能。在MySQL中,索引是在存储引擎层而不是服

2021-01-06 18:32:46 105

原创 数据库三大范式

范式与反范式第一范式:第一范式 就是 无重复的列, 有唯一标识 ,能够区分不同的行第二范式: 满足第一范式 非主键的列必须完全依赖于主键,而不能仅仅是依赖主键的其中某个列第三范式: 非主键列必须直接依赖主键,不能存在传递依赖。换句话说,就是假设A是主键,那么B,C都是直接依赖A,而不能是C依赖B,B依赖A这种传递依赖方式。对于任何给定的数据通常都有很多种表示方式,从完全的范式化到完全的反范式化,以及两者的这种。在范式化的数据库中,每个事实数据会出现并且只出现一次。相反,在反范式化的数据库表中,信

2021-01-06 18:31:49 154 1

原创 MySQL架构与特性

架构将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。连接管理与安全性每个客户端连接都会与服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或销毁线程,即服务器会拥有一个线程池。当客户端(应用)连接到MySQL服务器时,服务器需要对其进行认证。认证基于用户名、原始主机信息和密码。

2021-01-06 18:29:53 204 3

原创 Spring Bean加载过程

加载的时机非懒加载在refresh()的finishBeanFactoryInitialization()进行加载懒加载第一次调用beanFacoty.getBean()进行加载执行getBean()加载getBean()doGetBean()transformedBeanName(beanName)获取真正的BeanName 可能有别名从缓存获取getSingleton(beanName)从缓存中获取getObjectForBeanInstan

2021-01-06 18:27:11 361

原创 Spring IoC容器初始化过程

Spring IoC容器概述IoC容器和依赖反转模式如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的设计是非常不利的。在Spring中,IoC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象的引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。如何翻转依赖的控制把控制权从业务对象手中转交到平台或者框架中,是降低面向对象系统设计复杂性和提高面向对

2021-01-06 15:59:51 266

原创 Spring AOP初始化及执行过程-源码解析

背景当对不同的没有继承关系的对象引入一些公共的行为,比如记录日志,校验安全等,需要编写重复的代码,对一个系统的可维护性来说是非常不友好的,于是,引入了面向切面编程AOP不同于面向对象编程所关注的纵向编程,AOP所关注的是横向编程,为不同的对象方法织入切面切点 Point决定通知作用于哪些连接点通知 Advice决定在连接点做什么,为切面增强提供织入接口通知器 Advisor用于结合Point和AdviceSpring AOP 使用aspectj支持AOP在xml

2021-01-05 19:49:21 979 6

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除