自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 资源 (4)
  • 收藏
  • 关注

原创 2021-11-04

缓存一致性更新数据库 + 删除缓存(失败异步重试,重试 3 次后告警)读数据时,先查缓存,没有则查数据库 + 异步更新缓存更新缓存时获取门店锁,获取门店锁成功的消息进行缓存更新

2021-11-04 00:00:02 169

原创 线程异常处理

文章目录一、线程池异常处理流程二、源码执行流程2.1 execute 执行流程2.2 submit 执行流程三、线程异常捕获方法3.1 在 Runnable#run 方法中捕获代码异常3.2 在 Callable#call 方法中捕获异常3.3 重写 ThreadPoolExecutor#afterExecute3.4 为工作者线程设置 UncaughtExceptionHandler一、线程池异常处理流程1.1 当执行方式是 execute 时,可以看到堆栈异常的输出原因:ThreadPoolExe

2021-05-06 22:25:04 1500

原创 Java 队列

一、ArrayBlockingQueue基于 ReentrantLock 的有界阻塞队列,支持公平锁ArrayBlockingQueue 维护了一把全局锁,无论是出队还是入队,都共用这把锁,这就导致任一时间点只有一个线程能够执行。那么对于 “生产者-消费者” 模式来说,意味着生产者和消费者不能并发执行,可能出现性能瓶颈二、DelayQueueDelayQueue 是一个无界阻塞队列,用于放置实现了 Delayed 接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对

2021-05-06 22:21:28 227

原创 多线程参数设置

一、默认值corePoolSize=1eueCapacity=Integer.MAX_VALUEmaxPoolSize=Integer.MAX_VALUEepAliveTime=60sallowCoreThreadTimeout=falsejectedExecutionHandler=AbortPolicy()二、核心参数设置为了说明合理设置的条件,我们首先确定有以下几个相关参数:tasks,程序每秒需要处理的最大任务数量(假设系统每秒任务数为 100~1000)tasktime,

2021-05-06 22:19:01 2797

原创 https 证书过期问题排查

一、问题描述在服务协议由 http 迁移至 https 时,我发现线上环境报错javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failedCaused by: java.security.cert.Certif

2021-04-02 18:17:57 6385 1

原创 Java 开发手册笔记

Java 开发手册笔记基于嵩山版文章目录Java 开发手册笔记一、OOP 规约二、并发处理三、前后端规约四、日期时间五、异常日志六、单元测试七、MySQL 数据库一、OOP 规约1.1【强制】如上所示 BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法。说明:equals() 方法会比较值和精度 (1.0 与 1.00 返回结果为 false) ,而 compareTo() 则会忽略精度二、并发处理2.1【强制】SimpleDateForma

2021-01-14 16:18:27 274

原创 SQL 性能优化经验总结

文章目录一、慢 SQL 语句诱因1.1 无索引、索引失效1.1.1 创建合适的索引1.1.2 索引失效场景1.2 锁等待1.3 不恰当的 SQL 语句1.3.1 优化分页查询1.3.2 优化 SELECT COUNT(*)1.3.3 优化 SELECT *1.4 不恰当的索引1.4.1 索引选择性差1.4.2 索引冗余1.5 不恰当的表字段数据类型1.5.1 BIGINT 转 INT1.5.2 DATETIME 转 TIMESTAMP1.5.3 使用 ENUM1.5.4 NULL 和 NOT NULL1.6

2020-12-16 16:57:05 176

原创 MySQL 参数设置优化

文章目录一、MySQL 体系结构二、内存调优2.1 QueryCache2.2 Buffer Cache2.2.1 innodb_buffer_pool_size2.2.2 innodb_buffer_pool_instances2.2.3 innodb_read(write)_io_threads2.2.4 innodb_log_file_size2.2.5 innodb_log_buffer_size2.2.6 innodb_flush_log_at_trx_commit参考一、MySQL 体系结构

2020-12-16 16:53:11 660 1

原创 JVM 性能调优

文章目录一、JVM 内存模型1.1 堆1.2 程序计数器1.3 方法区1.4 虚拟机栈1.5 本地方法栈二、JVM 运行原理三、优化 Java 编译3.1 热点探测3.2 逃逸分析3.2.1 栈上分配3.2.2 锁消除3.2.3 标量替换四、优化垃圾回收机制4.1 GC 算法4.2 查看 & 分析 GC 日志4.3 GC 调优策略4.4 查看 JVM 的 GC 情况五、优化 JVM 内存分配5.1 对象在堆中的生存周期5.2 查看 JVM 堆内存分配5.3 JVM 内存分配的调优过程六、内存持续上

2020-12-16 16:47:37 257

原创 ShardingSphere 系列(6)— sharding-proxy 源码解析

ShardingSphere 系列(5)— sharding-proxy 源码解析文章目录ShardingSphere 系列(5)— sharding-proxy 源码解析一、获取 SQL 命令执行引擎二、获取 SQL 请求类型三、获取 SQL 请求命令包四、获取 SQL 命令执行器五、执行 SQL 请求5.1 TextProtocolBackendHandler 实例化5.2 执行 入口5.2.1 JDBCDatabaseCommunicationEngine5.2.2 JDBCExecuteEngin

2020-12-11 11:03:02 1243

原创 ShardingSphere 系列(5)— sharding-jdbc 强制路由

文章目录一、什么是强制路由?二、ShardingSphere 强制路由设计三、基于强制路由访问目标数据库表四、项目源码参考一、什么是强制路由?强制路由与一般的分库分表路由不同,它并没有使用任何的分片键和分片策略。有时候,我们需要为 SQL 执行开一个“后门”,允许在没有分片键的情况下,同样可以在外部设置目标数据库和表,这就是强制路由的设计理念二、ShardingSphere 强制路由设计基于 Hint 进行强制路由的设计和开发过程需要遵循一定的约定,同时,ShardingSphere 也提供了专门的

2020-12-11 10:57:15 6065

原创 ShardingSphere 系列(4)— sharding-proxy 实现分库分表

ShardingSphere 系列(4)— sharding-proxy 实现分库分表文章目录ShardingSphere 系列(4)— sharding-proxy 实现分库分表一、下载安装包二、加入 MySQL 驱动包三、修改配置文件3.1 server.yaml3.2 config-sharding.yaml四、启动服务并验证4.1 服务启动4.2 分库分表验证参考一、下载安装包下载 :: ShardingSphere (apache.org)我下载的是 apache-shardingsphe

2020-12-11 10:54:27 1502

原创 ShardingSphere 系列(3)— sharding-jdbc 分库分表实践

文章目录业务场景梳理一、项目准备二、集成 shardingsphere三、分库分表3.1 单库单表3.2 分库3.3 分表3.4 分库分表四、项目源码参考业务场景梳理我们考虑一个在医疗健康领域中比较常见的业务场景。在这类场景中,每个用户(User)都有一份健康记录(HealthRecord),存储着代表用户当前健康状况的健康等级(HealthLevel),以及一系列健康任务(HealthTask)。通常,医生通过用户当前的健康记录创建不同的健康任务,然后用户可以通过完成医生所指定的任务来获取一定的健康积

2020-12-09 09:25:05 474

原创 ShardingSphere 系列(2)—分库分表如何落地

文章目录从数据存储和访问的演进过程说起一、什么是数据分库分表?二、分库分表的表现形式三、分库分表与读写分离四、分库分表解决方案和代表框架4.1 客户端分片4.2 代理服务器分片4.3 分布式数据库从数据存储和访问的演进过程说起以 MySQL 为代表的关系型数据库中的单表无法支持大数据量的存储和访问方案,自然而然的,你可能会想到是否可以采用诸如 MongoDB 等 NoSQL 的方式来管理数据?但这并不是一个很好的选项,原因有很多:关系型生态系统非常完善关系型数据库的事务特性分库分表方案更多的

2020-12-08 21:33:11 334

原创 ShardingSphere 系列(1)—简介

文章目录一、Sharding-JDBC二、Sharding-ProxyShardingSphere 由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar 这三款相互独立的产品组成,其中前两款已经正式发布,而 Sharding-Sidecar 正在规划中一、Sharding-JDBCShardingSphere 的前身是 Sharding-JDBC,所以这是整个框架中最为成熟的组件。Sharding-JDBC 的定位是一个轻量级 Java 框架,在 JDBC

2020-12-08 21:23:26 355

原创 mysql-connector-j SQL 请求执行过程梳理

文章目录一、SQL 请求调用链路跟踪1.1 ClientPreparedStatement:SQL 请求入口1.2 NativeProtocol:执行 SQL 请求并返回结果1.2.1 发送 SQl 命令包,获取结果集包头1.2.2 读取结果集包的字段包和行数据包1.3 SQl 请求执行时序图(无拦截器)二、QueryInterceptor2.1 前置拦截2.1.1 第一处拦截2.1.2 第二处拦截2.2 后置拦截2.2.1 第一处拦截2.2.2 第二处拦截2.3 拦截器总结本次分析基于 mysql-co

2020-11-08 22:37:43 551

原创 Mybatis 插件原理解析

文章目录一、构建 SqlSessionFactory 的过程1.1 构建 Configuration1.2 映射器内部组成1.3 构建 SqlSessionFactory二、SqlSession 运行过程2.1 映射器动态代理2.2 SqlSession 四大对象2.2.1 Executor2.2.2 StatementHandler2.2.3 ParameterHandler2.2.4 ResultHandler2.3 SqlSession 运行总结三、插件3.1 插件接口3.2 插件初始化3.3 插件的

2020-10-02 17:54:10 394

原创 分布式缓存

文章目录一、todo二、todo三、缓存常见问题3.1 缓存雪崩3.2 缓存穿透3.3 缓存预热3.4 缓存更新3.5 缓存降级一、todo二、todo三、缓存常见问题3.1 缓存雪崩缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。缓存正常从 Redis 中获

2020-10-01 11:56:07 128

原创 分布式 session

文章目录一、什么是 session二、什么是 session 失效三、分布式 session 解决方案3.1 session 同步法3.2 客户端存储法3.3 反向代理 hash 一致性3.3.1 四层代理 hash3.3.2 七层代理 hash3.4 后端统一存储四、总结一、什么是 session服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。web 开发中,web-server 可以自动为同一个浏览器的访问用户自动创建 session,提供数据存储功能。最常见的

2020-10-01 11:54:52 342

原创 分布式锁

文章目录一、分布式锁应用场景二、分布式锁条件三、分布式锁的实现方式3.1 数据库锁3.1.1 基于MySQL锁表3.1.2 采用乐观锁增加版本号3.2 Redis 分布式锁3.2.1 基于 set() 实现3.2.2 基于 setnx,get,getset 实现3.3 ZooKeeper 分布式锁参考文章一、分布式锁应用场景分布式系统中访问共享资源就需要一种互斥机制,来防止彼此之间的互相干扰,以保证一致性,在这种情况下,我们就需要用到分布式锁二、分布式锁条件获取锁和释放锁的性能要好判断是否获得锁

2020-10-01 11:53:40 157

原创 分布式事务

文章目录一、分布式事务协议1.1 2PC(两阶段提交)第一阶段:投票阶段第二阶段:事务提交阶段1.2 3pc(三阶段提交)第一阶段:can_commit第二阶段:pre_commit第三阶段:do_commit二、分布式事务解决方案2.1 全局事务(DTP 模型)2.1.1 XA 规范2.1.2 XA 规范流程2.1.3 基于XA协议的两阶段提交方案2.2 基于可靠消息服务(事务消息中间件)2.3 基于本地消息表2.4 TCC2.4.1 TCC 机制2.4.2 TCC 事务参与方要求2.4.3 TCC的优点

2020-10-01 11:50:38 192

原创 分布式理论总览

文章目录一、集中式与分布式1.1 集中式系统1.2 分布式系统二 分布式理论2.1 CAP 理论2.1.1 CAP 简介2.1.2 CAP 论证2.2 BASE 理论2.2.1 Basically Available2.2.2 Soft State2.2.3 Eventually Consistent三、分布式常见问题参考文章一、集中式与分布式1.1 集中式系统由一台或多台主计算机组成中心节点,数据集中存储于这个中心节点中,并且整个系统的所有业务单元都集中部署在这个中心节点上,系统的所有功能均由其集中

2020-10-01 11:38:00 374

原创 三、MyCat 客户端 SQL 请求执行流程

RW#run 轮询注册队列中是否有 AbstractConnection,若存在且为读事件则调用 AbstractConnection#asynRead 异步读取数据,实际处理逻辑见 NIOSocketWR#asynReadNIOSocketWR#asynRead 从 前端连接的 channel 中读取数据,并且保存到对应 AbstractConnection 的 readBuffer 中,之后调用 AbstractConnection#onReadData 处理读取到的数据@Override...

2020-09-30 16:55:42 750

原创 五、MyCat 的连接池模型—— jdbc 模式

文章目录5.1 核心对象5.1.1 ConMap 和 ConQueue5.1.2 PhysicalDatasource5.1.3 PhysicalDBPool5.1.4 PhysicalDBNode5.2 创建数据库连接5.2.1 创建新数据库连接时机5.2.2 创建新数据库连接5.2.3 总结5.3 获取数据库连接5.3.1 涉及的核心类5.3.2 获取可用数据库连接过程5.3.3 总结5.4 释放已用的数据库连接5.5 关闭数据库连接MyCat 为了最高效的利用后端的 MySQL 连接,采取了不同于

2020-09-30 16:35:58 1025

原创 Dubbo 概述

Dubbo 概述文章目录Dubbo 概述Dubbo 核心组件Dubbo 总体调用流程服务暴露过程消费者调用流程Dubbo 注册中心1 工作流程2 数据结构3 订阅发布的实现3.1 发布实现3.2 订阅实现Dubbo 启停原理解析1 优雅停机原理解析Dubbo 远程调用1 Dubbo 通信协议2.1 dubbo://(推荐)2.2 rmi://2.3 hessian://2.4 http://2.5 webservice://2.6 thrift://2.7 memcached://2.8 redis://

2020-09-28 23:02:23 774

原创 四、MyCat 初始化

MyCat 初始化文章目录MyCat 初始化1 配置文件读取2 创建物理数据库连接池(PhysicalDBPool)3 创建物理数据库节点(PhysicalDBNode)MyCat 初始化主要负责启动 MycatServer 实例,启动 MycatServer 实例的过程中,核心工作是读取并解析 Mycat 配置文件(schema.xml、rule.xml 和 server.xml)。MycatServer 使用”饿汉模式“初始化一个单例public class MycatServer { priv

2020-09-27 01:31:05 262

原创 Java 线程状态及转换关系

文章目录一、Java 线程状态1 NEW(新建)2 RUNNABLE(可运行)3 BLOCKED(阻塞)4 WAITING(无限期等待)5 TIMED_WAITING(限期等待)6 TERMINATED(结束)二、Java 线程状态转换图三、VisualVM 线程监控线程状态与 Java 线程状态对应关系1 运行2 休眠3 等待4 驻留5 监视参考文章一、Java 线程状态1 NEW(新建)java.lang.Thread.State枚举中的NEW状态描述:/** * Thread state f

2020-09-14 23:44:45 293

转载 深入解析String#intern

引言在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声明出来的String对象会直接存储在常量池中。如果不是用双引号声明的String

2017-07-05 16:23:58 397

转载 ArrayList详解

前言这个分类中,将会写写Java中的集合。集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织、存储数据。这里写的集合,一部分是比较常见的、一部分是不常用但是我个人平时见到过的,一些比较相似的集合(比如HashMap和Hashtable)就只讲一个,突出它们之间的区别即可。最后,要指出一点,对于集合,我认为关注的点主要有四点:

2017-06-23 13:36:35 352

原创 字符串排序算法概述

一 键索引计数法首先针对小数组的排序方法,我们将数组中不同的字符串看做一个键r,对应键有个值r,如果需要按键值排序,那么键索引计数法就十分高效例如,我们将学生分为若干组,要求按照组号进行排序。此处组好就是对应的键值,我们分一下四个步骤进行排序:1 频率统计创建一个int数组count,并计算每个键出现的频率。对于每一个字符串,使用对应的键访问count数组并将其加1。如果键

2017-05-22 16:10:09 1293

原创 浅析数据压缩算法

数据压缩是减少信息传输量最经济直接的办法,所以这篇文章将讲解一些经典的数据压缩算法。一 热身:基因组对于生物学的基因研究中,A、C、T、G是是用来表示生物DNA的四种碱基,对基因序列的处理实际上是对这四种碱基的处理,因此为了解决这种字符种类较少且固定的字符序列,我们可以用双位编码(用2bit位可以表示四中字符)压缩来解决这个问题。在这种方法中,只需要建立字母表即可对字符序列进行压缩和展开。

2017-05-17 15:51:17 8023

原创 浅析jvm与jmm模型结构与关系

最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。一 jvm结构jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。1 Class Loader(类加载器)

2017-05-13 14:09:36 8305 3

原创 AndroidStudio中使用Jacoco统计Android应用程序代码覆盖率

最近在做针对Android应用程序代码覆盖率的统计工作,刚开始从论文中看到大多数研究者采用emma这个工具来统计Android应用程序代码覆盖率,但是我看过一些资料后发现emma只能对eclipse中的Android项目进行插装,由于AndroidStudio(以下简称AS)项目结构和eclipse项目结构不同,因此无法用ant工具来编译AS项目(当然如果你精通ant工具,应该可以实现对AS项目的

2017-05-09 20:50:30 8832 14

原创 ConcurrentHashMap源码解析(JDK 1.8)

一 成员变量解析    /* * Encodings for Node hash fields. See above for explanation. */ // 扩容节点的hash值 static final int MOVED = -1; // hash for forwarding nodes // 树节点的hash值

2017-03-15 19:06:46 698

原创 双重检查机制被破解的声明

在单线程下获取单例的都代码如下所示:// Single threaded versionclass Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) helper = new Helper(); return helper;

2017-02-17 15:57:00 744

转载 java基础之volatile关键字

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解

2017-02-16 18:44:03 338

转载 Java虚拟机学习 - 类加载机制

类加载机制JVM把class文件加载的内存,并对数据进行校验、转换解析和初始化,最终形成JVM可以直接使用的Java类型的过程就是加载机制。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、

2017-02-15 21:23:59 256

转载 Java虚拟机学习 - 对象内存分配与回收

对象优先在Eden上分配大多数情况下,对象优先在新生代Eden区域中分配。当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC)。Minor GC期间虚拟机将Eden区域的对象移动到其中一块Survivor区域。大对象直接进入老年代所谓大对象是指需要大量连续空间的对象。虚拟机提供了一个XX:PretenureSizeThre

2017-02-15 21:21:55 270

原创 java基础之foreach

foreach实现原理集合和数组可以用foreach进行元素访问是因为实现了java.lang.Iterable接口。jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一看Iterable接口并没啥特别之处,只是定义了一个迭代器而已。public interface Iterable { /**

2017-02-15 19:04:48 565

翻译 java序列化算法揭秘

序列化是将对象保存为字节序列的过程,反序列化是将字节序列转换为对象的过程。Java Serialization API为开发者提供了一套标准机制来处理对象序列化。本文你将看到如何序列化一个对象以及为什么对象的序列化在有的情况下是必须的。你将会学习到java的序列化算法以及一个揭示序列化对象格式的例子。阅读完本篇内容后,你讲会对java的序列化算法如何工作以及一个实体对象在底层如何被序列化有一个深入

2017-02-14 12:34:06 1145

jacoco插装文件

jacoco插装文件

2017-05-09

新闻分类浏览app

新闻分类浏览app

2016-07-11

css全文指南

java移动图形编程

2015-01-10

S_key认证技术

java移动图形编程java移动图形编程java移动图形编程java移动图形编程

2015-01-10

空空如也

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

TA关注的人

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