- 博客(37)
- 资源 (1)
- 收藏
- 关注
原创 Mybatis Plus 中的流式查询
mybatis plus 中自定义如下接口,就可以实现流式查询,mybatis 中同样适用。@Select("select * from t_xxx t ${ew.customSqlSegment}")@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)@ResultType(ClearReconDiffAbnormalDO.class)void listByStream(@Param(Constants.WRA
2021-08-26 16:50:29
6612
原创 Mybatis Plus 自定义批量更新和插入方法
定义方法@Slf4jpublic class InsertBatchMethod extends AbstractMethod { @Override public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { final String sql = "<script>inser
2021-08-18 09:30:53
2020
原创 ES 实现自动补全功能
新建索引PUT /hot_search_index{ "mappings": { "properties": { "title":{ "type": "text", "analyzer": "ik_max_word", "fields": { "keyword":{ "type":"completion" } } } } }}
2021-04-03 22:11:09
937
原创 Java 网络编程的演进史和 epoll
BIOpublic class BioServer { private static ExecutorService executorService = Executors.newFixedThreadPool(8); public static void main(String[] args) throws IOException { // 绑定端口,启动服务器 ServerSocket serverSocket = new ServerSocket(9
2021-02-25 11:45:04
274
1
原创 Netty 自定义协议实战
Netty 自定义协议实战依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.50.Final</version></dependency><dependency> <groupId>com.caucho</groupId>
2021-02-10 09:51:25
330
原创 Verifier 简单的 Java 校验工具
verifier自己写的开源的、自由简单的 Java 校验工具,支持代码编写和注解方式,支持 Springboot 集成。引入<dependency> <groupId>online.qiqiang</groupId> <artifactId>verifier-spring-boot-starter</artifactId> <version>1.1.7-RELEASE</version></dep
2020-12-31 16:31:59
1927
原创 基于 Netty 纯手写 RPC 框架
最近为了复习 netty,纯手写了一套 RPC 框架,项目地址 qingcha-rpc项目介绍本项目是一个基于 netty 的 rpc 框架,可以使用纯 java 编程或者跟 SpringBoot 集成。本项目纯属练手项目,未经测试和生产使用,谨慎使用!欢迎交流。使用介绍java 方式Server 端引入依赖<dependency> <groupId>com.qingcha.rpc</groupId> <artifactId>qin
2020-11-05 11:08:36
308
原创 AQS 详解之独占锁
本文以ReentrantLock的非公平锁图解 AQS 独占锁加解锁过程。前置知识了解static final class Node { /** 标记为共享节点 */ static final Node SHARED = new Node(); /** 标记为独占节点 */ static final Node EXCLUSIVE = null; /** 等待状态值,表示被取消 */ static final int CANCELLED = 1;
2020-10-29 16:34:19
239
1
原创 Linux 下通用 jar 启动脚本
脚本#!/bin/zsh# 使用命令USAGE="Usage: startup.sh {start|stop|restart}"# 参数个数exec_param_count=$## 如果不是 stop 命令,那么就是需要启动启动服务,此时参数不能少于3个,如果小于3,则提示使用命令if [ $1 != "stop" -a $exec_param_count -lt 1 ]; then echo $USAGE exitficd $(dirname $0)WORKSPA.
2020-10-14 16:22:26
347
原创 Maven 自定义插件实战
实战开发插件使用 IDEA,创建一个org.apache.maven.archetypes:maven-archetype-mojo模版项目,项目名叫demo-maven-plugin。注意,maven 插件的命名有讲究的,官方插件命名格式是maven-pluginName-plugin,非官方插件的命名格式是pluginName-maven-plugin。修改 pom.xml 。<project xmlns="http://maven.apache.org/POM/4.0.0" xmln.
2020-09-24 16:46:10
296
原创 dubbo 自定义异常处理方案
传统的MVC异常处理在传统的 SpringMVC 开发的时候,层次结构经常是这样的。View — Controller — Service在这样的架构层次上做自定义业务异常处理,一般的方案是在用 Spring 的统一异常处理机制,即@ControllerAdvice加上@ExceptionHandler来捕获自己感兴趣的异常。如自定义异常如下:public class BaseQingChaException extends RuntimeException { private String
2020-09-02 15:28:38
2011
2
原创 线程池总结加实战
使用线程池的好处降低资源消耗。提高响应速度。提高线程的可管理性。线程池的实现原理当用户提交了一个任务到线程池,线程池执行流程如下:线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程。线程池判断工作队列是否已满。如果没满,则将新提交的任务存储在这个工作队列中。如果满了则进入下一个流程。线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果满了,则交给饱和策略.
2020-08-21 11:14:06
317
原创 记一次Mysql group 的 bug
项目中用到了GROUP_CONCAT函数,测试环境没有问题,到生产环境发现该函数返回的结果被截取掉了。经过排查是由于该函数默认结果长度限制是1024,将限制调整大一些即可。SET GLOBAL group_concat_max_len=1024000;SET SESSION group_concat_max_len=1024000;show variables like "group_concat_max_len";...
2020-07-13 17:25:28
215
原创 Elk搭建古诗搜索实战
本文安装环境是macos,基于 elk 7.6.2搭建,不同版本之间略有差异,可以选择官网下载,也可以点击这里的的链接下载。软件下载地址提取码elasticsearchhttps://pan.baidu.com/s/1835hI05ZqT1LSCxGtDCBxQokyvkibanahttps://pan.baidu.com/s/1m6NzW4FbzHWpwsWz3AtmHgb6bvlogstashhttps://pan.baidu.com/s/1F8eANfMF
2020-07-04 23:55:07
400
原创 Protobuf 了解一下
ProtoBuf 使用ProtoBuf 全称 protocol buffers,是 google 开源的一个平台无关、语言无关的序列化框架。官网点击这里 protobuf 官网 文本通过一个简单的案例介绍 protobuf 的简单使用。创建 addressbook.proto 文件创建一个 maven 项目,在 resources 下创建一个目录 proto (可自己更改),然后在该目录下创建一个 addressbook.proto 文件
2020-06-22 16:17:25
430
原创 juc 阻塞队列被问怕了,熬夜总结
juc 指的是 jdk 下的 java.util.concurrent包,在这个包下提供了很多并发相关的工具类。本文将解析这个包下面的一些阻塞队列。阻塞队列其实是实现了java.util.concurrent.BlockingQueue接口的一些实现类,要搞明白阻塞队列,那么就要清楚这个接口到底是做什么的。public interface BlockingQueue<E> extends Queue<E> { boolean add(E e); boolean o
2020-05-15 11:30:05
211
原创 这下该懂 ArrayBlockingQueue 了吧
阻塞队列基础知识详见 juc 阻塞队列被问怕了,熬夜总结。源码详解成员变量和构造函数/** 队列中存放数据的数组 */final Object[] items;/** 下一次 take, poll, peek 或者 remove 的位置 */int takeIndex;/** 下一次 put, offer, 或者 add 的位置 */int putIndex;/** 队列中元素的数量 */int count;/** 全局锁 */final ReentrantLock lock;/
2020-05-15 11:29:41
229
原创 Spring BeanDefinition 详解与案例
介绍BeanDefinition 是 Spring 用来描述用来生成 Bean 的类的元数据信息的一个接口。容器中的 BeanDefinitionMap 是 IOC 的一个基础的组成部分,也是非常重要的一个组件。BeanDefinition 是一个接口,它的继承关系如下:AbstractBeanDefinition是一个抽象类,它的三个子类都具有各自的特点,下会重点分析。BeanDefi...
2020-04-12 09:54:28
1246
原创 Netty 服务端启动源码解析
netty 是一个网络通信框架,底层是 java 的 NIO。使用 netty 后开发者可以将重点都放在对业务的处理上。而它的启动流程是有固定的模板的。public class NettyServer { public static void main(String[] args) throws InterruptedException { // 1. 创建负责接收客户端...
2020-03-10 15:53:55
323
原创 基于 Netty 的 RPC 调用
RPC 全称 Remote Procedure Call(远程过程调用),本质上是在两个不同机器之间通过网络传输数据,但是在本地看来是通过接口调用一样。引入依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> ...
2020-03-09 10:40:25
260
原创 2、Eureka 服务端源码详解
启动在 SpringBoot 中,一般需要加上@EnableXXX才能启用某种功能的,那么这个注解就是源码分析的入口。那么看看@EnableEurekaServer里面是什么。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EurekaServerMarkerConfigurat...
2020-03-09 09:48:36
269
原创 1、Eureka 简单使用和集群搭建
应用使用 Spring-Cloud 必须引入 SpringBoot,并且两者版本有一个对应关系,这个对应关系可以在官网查到。Spring CloudSpring BootHoxton2.2.xGreenwich2.1.xFinchley2.0.xEdgware1.5.xDalston1.5.x<parent> &l...
2020-03-09 09:48:01
151
原创 MySql 事务详解与 MVCC 多版本并发控制
事务四大特性(ACID)原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败回滚。一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。隔离性(Isolation):事务之间相互隔离不被干扰。持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据...
2020-03-04 22:05:02
209
原创 MySql 主从复制原理
原理解析当应用程序执行增、删、改三种操作时,会在 master 上做两件事情:执行 sql 操作数据和写入本次操作的日志记录到 bin-log 中。此时 slave 节点会有一个 IO 线程从 master 中的 bin-log 中读取日志文件到自己的 relay-log 日志中。slave 节点读取到日志之后,会有另一个 Sql 线程从自己的 relay-log 中读取日志然后执行 s...
2020-03-04 16:15:55
166
原创 Java 手写常用的负载均衡算法
随机普通随机随机负载是最简单的负载,通过在 [0,ip个数] 之间产生随机数获得 ip 地址。public class Random { public static final List<String> IP_LIST = new ArrayList<String>() {{ add("127.0.0.1"); add("127...
2020-03-04 13:54:35
396
原创 分布式 Session 问题及解决方案
本文参考曾宪杰著作《大型网站系统与Java中间件实践》HTTP 协议本身是无状态的,需要基于 HTTP 协议支持会话状态的机制。在会话开始时,分配一个唯一的会话标识(SessionId),通过 Cookie 把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉服务器请求是属于哪个会话的。当服务器变成集群部署的时候,通过负载均衡的方式分发请求到不同的机器上。如果第一次访问网...
2020-02-25 20:37:35
260
原创 一文搞懂 Redis 从面试到应用
本文不定期更新。一、Redis 简介Redis 是一个开源的内存结构存储系统。可作于数据库、缓存和消息中间件。二、常用数据类型String 字符串。Hash 散列。List 列表。Set 集合。ZSet 有序集合。Stream 流(用于消息队列)。pub/sub三、 持久化方案RDB(Redis Database)。每间隔一段时间生成一个快照,快照生成则覆盖,只有一个...
2020-02-25 15:33:43
340
原创 Spring 的7种事务传播行为
事务传播行为事务传播行为指的是两个事务方法嵌套时对于事务的处理方式。Spring 有七种事务传播行为。PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_...
2020-02-25 15:28:07
340
原创 HashMap 源码解析及总结
成员变量解析/* HashMap 的最大容量为 2的30次方 由于 int 类型的数组占4个字节,一个字节是8位,即32位,但是有一位是符号位,所有最多只能左移30位 */static final int MAXIMUM_CAPACITY = 1 << 30;// 当元素个数超过这个阈值时,则进行扩容int threshold;// 存数据的哈希桶tran...
2020-02-25 15:22:40
189
原创 ArrayList 源码总结
ArrayList 成员变量// 默认容器的大小private static final int DEFAULT_CAPACITY = 10;// 存储的元素transient Object[] elementData;// 容器中元素的数量private int size;add(E e) 方法解析public boolean add(E e) { // 扩容 ...
2020-02-25 15:20:55
129
1
原创 分布式事务一致性解决方案
二阶段提交(2PC)方案二阶段提交(Two-phase Commit,2PC),需要引入协调者 Coordinator 来参与事务行为,并且最终决定是否提交事务。二阶段提交分为两个阶段:提交事务阶段协调者询问每个系统是否可以执行提交事务的操作每个系统执行本地事务,并写入本地的 Undo/Redo 日志,此时事务还没有提交。返回 yes/no 给协调者。执行事务阶段协调者...
2020-02-25 15:11:47
848
原创 TCP 三次握手和四次挥手
名词解析seq:序号(sequence number),占32位,用来标记从传输端到目的端发送的字节流,发送方发送数据时对此进行标记。ack:确认号(acknowledgement number),占32位,只有 ack 标志位为1时,确认号字段才有效,ack=seq+1。flag:标志位,总共有六个。URG:紧急指针有效。ACK:确认序列号有效。PSH:接收方应该尽快RST:...
2020-02-21 19:34:34
142
原创 docker——开发者超市
简介Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。快速上手docker run hello-world入门篇基本概念镜像Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、...
2020-01-15 10:05:00
434
原创 常见的排序算法
冒泡排序主要思想:交换相邻的两个元素,将大的移到后面,每一趟选出最大的值。思路分析:对[0,n-1]排序,将最大的值放到 array[n],下一次对[0,n-2]排序。[0,n-1],对相邻的两个数比较,如果前面的数字比后面的大,则交换。如果某一趟排序中没有发生交换,则说明数组已经是有序的。代码实现:public void sort(int[] array) { // 对...
2020-01-15 09:54:14
213
原创 Spring核心方法 refresh 解析
refresh 方法简述refresh()是 Spring 最核心的方法,没有之一,上帝就是用这个方法创造了 Spring 的世界。这是一个同步方法,用synchronized关键字来实现的。该方法包含以下12个方法方法(步骤)。prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory(beanFactory)postProc...
2020-01-14 23:14:07
2015
原创 巧用 Spring @Order 进行排序
直接上代码public class OrderAnnotationTest { public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); List<Object> orderList = new ArrayList<>(3); order...
2020-01-14 23:10:53
2836
zsh-syntax-highlighting.zip
2020-09-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人