JavaNIO-Socket
参考文献
非阻塞 vs 阻塞
阻塞
阻塞模式下,相关方法都会导致线程暂停
ServerSocketChannel.accept 会在没有连接建立时让线程暂停
SocketChannel.read 会在没有数据可读时让线程暂停
阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置
单线程下,阻塞方法之间相互影响,几乎不能正常工作,需要多线程支持
但多线程下,有新的问题,体现在以下方面
32 位 jvm一个线程 320k,64 位 jvm 一个线程1024k,如果连接数过多,必然导致 OOM,并且线程太多,反而会因为频繁上下文切换导致性能降低
可以采用线程池技术来减少线程数和线程上下文切换,但治标不治本,如果有很多连接建立,但长时间inactive,会阻塞线程池中所有线程,因此不适合长连接,只适合短连接.
服务器端
123456789101112131415161718192021222324252627// 使用 nio 来理解阻塞模式, 单线程// 0. ByteBufferByteBuffer buffer = ByteBuffer.allocat ...
JavaNIO-ByteBuffer
参考文献
黑马Netty
Buffer(缓冲区)
Buffer是一个对象,它包含一些要写入或者要读出的数据.在面向流的I/O中,可以将数据直接写入或者将数据直接读到Stream对象中.
在NIO库中,所有数据都是用缓冲区处理的.在读取数据时,它是直接读到缓冲区中的;在写入数据时,写入到缓冲区中.任何时候访问NIO中的数据,都是通过缓冲区进行操作.
缓冲区实质上是一个数组.通常它是一个字节数组(ByteBuffer),也可以使用其他种类的数组.但是缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问以及维护读写位置(limit)等信息.
最常用的缓冲区是ByteBuffer,一个ByteBuffer提供了一组功能用于操作byte数组.除了ByteBuffer,还有其他的一些缓冲区,事实上,每一种Java基本类型(除了Boolean类型),都有与之对应的缓冲区:
类型
说明
ByteBuffer
字节缓冲区
CharBuffer
字符缓冲区
ShortBuffer
短整形缓冲区
IntBuffer
整形缓冲区
LongBuffer
长整型 ...
Java日志框架
参考文献
SLF4J user manual
Slf4j
简单使用
12slf4j-api-${version}.jarslf4j-simple-${version}.jar
12345678910<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> ...
JDK8特性-新的日期和时间API
参考文献
Convert between Date to LocalDateTime
旧的日期和时间API的缺点
Date类的缺点
Date类中的大多数方法都已经过时,因为它们不是线程安全的,而且有一些设计缺陷.
Date类中的时间表示是基于1970年1月1日的毫秒数,这种表示方式不太方便处理日期和时间.
Calendar类的缺点
Calendar类不是线程安全的,如果多个线程同时访问一个Calendar实例,可能会导致不可预测的结果.
Calendar类中的月份是从0开始计数的,这种设计很容易导致错误.
Calendar类中的方法名不够直观,比如要设置月份要使用set(Calendar.MONTH, month),而不是setMonth(month).
DateFormat类的缺点
DateFormat类不是线程安全的,如果多个线程同时访问一个DateFormat实例,可能会导致不可预测的结果.
DateFormat类中的解析和格式化方法都很慢,因为它们需要进行字符串和日期之间的转换.
新的日期和时间API
java.time包的类
123456789101112 ...
MySQL-各个版本的特性
[TOC]
MySQL各个版本的特性
MySQL 3.23
基本的SQL功能
ISAM和MyISAM存储引擎
BDB存储引擎
全文搜索
大文件支持
基本的权限管理
客户端/服务器通信协议
基本的查询优化与缓存
基本的表锁
窗口函数(部分)
MySQL 4.0
InnoDB存储引擎
ACID事务支持
行级锁定
外键约束
查询缓存
压缩协议
大文件支持(更大的文件尺寸)
多表更新与删除
子查询
高效的嵌套查询处理
MySQL 5.0
存储过程与函数
触发器
视图
游标
分区表
插件式存储引擎架构
INFORMATION_SCHEMA数据库
XA分布式事务
在线DDL
日志查询
MySQL 5.5
性能模式
信号处理
分区功能改进
InnoDB插件
语义表分析
语句摘要
度量单位转换
数字类型转换
新的字符集与排序规则
改进的查询优化器
MySQL 5.6
全文搜索改进
备份锁定
优化器跟踪
改进的InnoDB性能
多线程复制
MEMCACHED API支持
NoSQL接口
子查询优化
时间和日期函数改进
字符集和排序规则改进
MySQL 5.7
JSON数据类型
虚拟 ...
SpringBoot-SpringBoot项目启动流程分析
参考文献
SpringBoot源码分析(二)启动类流程
启动流程
基于SpringBoot 2.7.x
构造函数
123456789101112131415161718192021222324252627282930313233343536373839public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { // 设置资源加载器 this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); // 初始化加载资源类集合并去重 // 将启动类设置为属性存入primarySources (设置要加载的基础资源) this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); // TODO ...
SpringBoot-SpringMVC在SpringBoot项目中组件启动流程
参考文献
SpringMVC执行流程
DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心.用户发出请求,DispatcherServlet接收请求并拦截请求.
HandlerMapping为处理器映射.DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler
Handler让具体的Controller执行
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传 ...
SpringBoot-一个请求的处理全过程(未完待后续补充完整)
参考文献
请求流程
Tomcat线程接受到请求,经过一系列调用后,调用到ApplicationFilterChain的doFilter方法.doFilter方法调用ApplicationFilterChain的internalDoFilter方法,依次执行过滤器链的每个Filter的doFilter.
javax.servlet.http.HttpServlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
3. org.springframework.web.servlet.FrameworkServlet#service
4. javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
5. org.springframework.web.servlet.FrameworkServlet#doXXX
XXX: 表 ...
JDK8特性-default方法
参考文献
Java8实战
解决问题的三条规则
如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断.
类中的方法优先级最高.类或父类中声明的方法的优先级高于任何声明为默认方法的优先级.
如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体.
1234567891011121314151617181920package com.holelin.sundry.test.common;public interface A { default void hello() { System.out.println("Hello from A"); }}interface B extends A { default void hello() { System.out.println("Hello from B&qu ...
SpringBoot-注解@EnableAutoConfiguration自动装配原理
参考文献
SpringBoot 自动配置启动流程 为什么没有执行selectImports方法
@EnableAutoConfiguration注解
123456789101112131415161718192021222324252627282930@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage// 入口@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { /** * Environment property that can be used to override when auto-configuration is * enabled. */ String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautocon ...