- 博客(120)
- 问答 (2)
- 收藏
- 关注
原创 Unicode UTF-8 UTF-16 之间的关系
Unicode、UTF-8 和 UTF-16 是字符编码领域中非常重要的概念,它们之间有着紧密的联系,但又各自有不同的特点和用途。
2025-02-22 15:57:00
566
原创 binlog 介绍
公司使用的数据库是 glodendb最近自动化投产对一张 28w 的表进行全表 update、投产前已经是知道这个数据量的、认为没有问题、也没有在测试环境进行测试。结果投产那天直接报错这个是 glodendb 自己价的保护机制、而非 mysql 所属。那什么是 binlog 呢?binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。binlog 的使用场景。
2024-10-29 22:24:15
994
原创 distinct 和 group by
最近生产加了一个新字段 a、然后将主键赋值给 a。当然日常查数啥的、那个方便就那个、那个顺手就哪个呗。当时在想这样子跟 group by 有啥区别。然后投产后验证是否有漏网之鱼。真实业务场景下推荐使用 group by。看完几篇文章的结论就是。所以查一下两者的差异。
2024-10-19 17:30:23
268
1
原创 spock 并行执行单元测试
然后看日志发现即使使用了 mvnd 、构建机 20 个物理核心、mvnd 是 19 个并发、但是实际上有些模块的并发度还是非常低。发现 deploy 公共库还是需要十分钟左右、后面发现跳过所有单元测试之后、deploy 只需要 4 分钟。按构建机的配置来看、CPU 和 内存都是没有打满的、所以大概率不是这两个的问题。看了下打印的日志、依赖的是默认的 ForkJoinPool 池。所以想着从提升单元测试的速度来加快 deploy。但是很遗憾、整体的 deploy 没有丝毫的提升。
2024-10-11 22:19:38
265
1
原创 mvnd 初体验
mvnd 版本要选对、前面选了两个1.x.x 的版本、一直报错。单纯使用 mvn 打包所有代码、总共花费时间为 25 分钟。使用的是 jdk1.8 、mvnd 的版本为 0.7.1。后面使用 mvnd 之后、总花费时间为 10 分钟左右。程序打包的是 5 个 仓库、总共是 243 个模块。
2024-09-26 23:22:23
309
原创 Statement batch
我们可以看到 Statement 和 PreparedStatement 为我们提供的批次执行 sql 操作JDBC 引入上述 batch 功能的主要目的,是加快对客户端SQL的执行和响应速度,并进而提高数据库整体并发度,而 jdbc batch 能够提高对客户端SQL的执行和响应速度,其主要原理有:减少了JDBC客户端和数据库服务器之间网络传输的开销:使用 batch 功能前,每提交一个SQL,都需要一次网络IO开销,且提交后需要等待服务端返回结果后,才能提交下一个SQL;
2024-09-08 10:37:23
736
原创 BatchUpdateException 问题
我们发现它最大化的帮我们插入 39 条数据、只有第 21 条第数据没有插入进去。MySQL的batchUpdateException.getUpdateCounts()返回:{1,1,-3,1,1,-3,1,1,1,1}MySQL会将所有的语句全部执行完,然后数组中成功的返回1,失败的返回其它值,比如-3。Oracle则是一直执行,当遇到第一个失败的语句就会返回,所以会返回均为1的数组。我们插入 100 条数据、第 21 条和第 41 条是非法数据、会插入失败的。看看数据库现在又多少数据了。
2024-09-07 15:25:25
768
原创 计算机-操作系统
计算机出现的初期、是靠人类管理员进行调度的。排队十分钟、执行三秒钟后面开发了一个控制程序、在它的指挥下、可以批量执行程序、自动实现切换、不需要人工介入、效率提高了不少。允许多个程序同时进入计算机执行、如果程序 A 执行输入输出、就把 CPU 空出来给另一个程序 B 执行、一会B 再执行输入输出、再把 CPU 分给 A 执行。彼此交替、就不会浪费。
2024-05-21 07:36:52
1164
原创 数据的输入和输出
为了解决通信的问题、主板上铺设了一条公共线路、各个设备都连接到这条线路上、不管谁要和谁通信、都能使用它来传输、这条线路就是总线。总线上有CPU、内存、鼠标、键盘、硬盘、网卡、声卡、显卡等…说是一条总线、实际上是包含了传输数据的数据总线、传输地址都地址总线、进行控制管理的控制总线因为这条线路是共用的、所以大家不能一起用、不然就乱套了、为了统一管理、还专门安排了一个叫作总线控制的、由它来统一管理总线、大家要通信就找它申请、这就叫做总线仲裁。
2024-05-09 23:02:29
949
原创 Lombok builder 默认值
但是在 Lombok builder 模式默认值这个地方我却不止跌倒两次了。一个人不可能在同一个地方跌倒两次。
2024-04-27 22:07:23
272
1
原创 指令重排相关
指令流水线所带来的一些问题结构冒险流水线中出现硬件资源竞争数据冒险流水线中后面的指令需要等待前面指令完成数据的读写控制冒险流水线需要个怒前面指令的执行结果来决定下一步去哪儿之行为了解决指令流水线的数据冒险所带来的停顿、CPU 搞了个乱序执行。在遇到数据冒险时、指令调度单元从中选择一些没有数据依赖的指令来执行。后面再进行结果回写时、才按原有顺序进行回写。这就是 CPU 带来的乱序执行。Java 编译器处于 “优化” 的目的、按照某种规则将指令重新排序(尽管有时候看起来像乱序)
2023-08-06 22:23:38
316
原创 计算机存储设备
内存使用 DRAM 来存储数据的、也就是动态随机存储器。内部使用 MOS 和一个电容来存储。需要不停地给它刷新、保持它的状态、要是不刷新、数据就丢掉了、所以叫动态 、DRAM缓存使用 SRAM 来存储数据、使用多个晶体管(比如6个)就是为了存储1比特。
2023-07-15 11:34:55
337
原创 GC 日志
当使用本地方法 JNI 函数访问 JVM 中的字符串或数组数据,为保证数据安全性和准确性,获取数据(GetStringCritical)和释放数据(ReleaseStringCritical)这段过程必须在 “critical region”(临界区)执行 如果在执行临界区这段时间发生了 GC,JVM 会阻断 GC 的发生,也会阻断其他线程进入临界区,同时调 ReleaseStringCritical。当最后一个临界区的线程退出后,JVM 再进行一个 GC,即 GCLocker Initiated GC。
2023-04-06 22:13:58
552
原创 Spring Boot Logback启动流程
Spring Boot 默认使用的是 Logback 的日志框架、Logback 的组件主要通过 Spring Boot ApplicationListener 启动的// LoggingApplicationListener@Overridepublic void onApplicationEvent(ApplicationEvent event) { if (event instanceof ApplicationStartingEvent) { onApplicationSt.
2022-12-01 15:23:42
873
原创 package-info.java
package-info.java 文件估计大家见过但是自己却很少去创建和使用它、因为对于一般应用来说可能真的太少见了。它的作用主要是三个描述包使用注解修饰包、达到修饰该包下的类声明包中使用的类和常量(这个比较少用)描述包package-info.java 文件/** * 我是描述信息 */package com.demo.test.info;生成 JavaDoc 可以看到包的注释在说明列中使用注解修饰包假如某个包下、我们希望所有的返回值都应该非 Null、并且当我们编码的
2022-12-01 15:22:55
703
原创 Mysql replace into
CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) DEFAULT NULL, `msg` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`),&
2022-11-28 22:34:30
678
原创 Mysql DateTime 问题
/** * The maximum supported {@code LocalTime}, '23:59:59.999999999'. * This is the time just before midnight at the end of the day. */
2022-11-27 08:23:30
982
原创 Logback 相关组件
启动流程Logger logger = LoggerFactory.getLogger(Main1.class);然后回去找 ILoggerFactory 接口ILoggerFactory iLoggerFactory = getILoggerFactory();获取 SLF4JServiceProvider return getProvider().getLoggerFactory();如果 slf4j 没有进行初始化、也就是没有绑定到底使用哪个日志框架
2022-10-30 20:48:50
380
原创 Logback 的顶级接口
ILoggerFactory介绍一下 slf4j 的一些顶级接口public interface ILoggerFactory { public Logger getLogger(String name);}再看看 logback 对这个接口的实现 ch.qos.logback.classic.LoggerContextfinal Logger root;private&nb
2022-10-29 12:04:07
1079
原创 再看 Logback 源码
三大组件Logback 构建在三个主要的类上:Logger,Appender 和 Layouts。这三个不同类型的组件一起作用能够让开发者根据消息的类型以及日志的级别来打印日志。Logger 类作为 logback-classic 模块的一部分。Appender 与 Layouts 接口作为 logback-core 的一部分。作为一个通用的模块,logback-core 没有 logger 的概念。Appender 与 Layout有选择的启用或者禁用日志的输出只是 logger 的一部分功能。l
2022-10-24 21:51:58
396
原创 火焰图解释
on-cpu 花费在 CPU 上的时间off-cpu 花费在等待 I/O、锁等的时间on-cpu 火焰图采样原理对系统中运行的代码堆栈做多次的统计。每次统计的时候、找到这个时刻还在执行的堆栈锦雄计数、类似有一个监视器、每隔一段时间、就来看下系统中的堆栈、如果看到了就对堆栈计数加一。这样一直在 CPU 上运行的堆栈占比就会很大、通过这样的方式来计算、而不是计算这个方法执行了多久。Off-cpu 火焰图采样原理监听失去 CPU 和获取 CPU 的两个事件、通过这两个事件的差值计算出 off-cpu 的
2022-10-21 23:27:04
238
原创 Java getResource
最近在工作中有用到资源加载、发现 和 都可以加载 下的文件对比一下他们之间的异同通过日志分析我们得知 如果传入的参数以 开头的话则获取到的是当前 的绝对路径。如果不是的话、则是获取到当前 所在的路径 则默认获取到的就是 下的路径、如果传入的参数以 开头则返回 双亲委派机制、先给父类加载器中尝试加载、然后再到自己的。最终还是调用 这个关键在于对 的解释如果是以 开头、则直接去掉 然后返回如果不是则获取当前 的全路径、然后替换 然后返回...
2022-07-02 09:10:41
276
原创 关于 Git rebase 简谈
关于 rebase 、最常用的可能是使用 idea pull 代码的时候勾选的选项吧对于本地分支 pull 对应远程分支实际上是建议使用 rebase 的、因为这些变更只在本地、并不会产生任何坏的影响。这样子对于分支来说、会相对比较好看、并且对于公共开发、使用的是同一个分支、这样子就不会产生额外的分叉、当然要整个团队成员都是 rebase 、当 pull 远程分支到本地的时候。至于远程分支之间的合并、那就是另说了。至于压缩本地 commit 这个功能相对来说还是用得比较少。...
2022-06-30 22:47:40
343
原创 Spring Converter 体系
最近封装 RPC 相关的模块,领导说数据转换可以考虑使用 Spring 原有的 Converter 体系。Converter<S, T> 最简单的转换器、相关的顶层接口有 ConditionalConverter、GenericConverter、ConverterFactory、ConvertingComparator、ConverterRegistryConversionService Spring 数据转换的入口、它根据相关参数将调用路由到具体的 Converter。 相关的接口和类
2022-05-17 12:00:00
355
原创 静态方法杂谈
何时使用静态方法一个 stackoverflow 上面的问题、一个高赞的回答也是比较认可的答案调用此方法是否有意义,即使尚未构造任何对象假设 Car 类中有如下方法public class Car { double convertMpgToKpl(double mpg){ ........ }}那么这个方法将是静态的、因为将 Mpg 转换为 Kpl 我们不需要创建 Carvoid setMileage(double mpg)但是该方法不能是静态的、因为该方法的功能是为
2022-05-16 12:00:00
106
原创 Logback 配置
logback 的配置logback 会在类路径下寻找名为 logback-test.xml 的文件。如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。如果没有找到,logback 会继续寻找名为 logback.xml 的文件。如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了 Co.
2022-05-15 11:30:00
2791
原创 Java Type
Type 体系Class这个我们是最常见的。我们经常会问某个对象/变量是什么类型、我们经常回答都是对应一个具体的 Classpublic class ClassMain { private Integer age; private String name; private List<String> alias; public static void main(String[] args) { ClassMain classMain = ne
2022-05-15 10:04:09
172
原创 Logback 架构与输出流程
Logback 主要由三个 jar 一起组成slf4j-apilogback-corelogback-classic<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3<.
2022-05-14 12:00:00
395
原创 package-info.java
package-info.java 文件估计大家见过但是自己却很少去创建和使用它、因为对于一般应用来说可能真的太少见了。它的作用主要是三个描述包使用注解修饰包、达到修饰该包下的类声明包中使用的类和常量(这个比较少用)描述包package-info.java 文件/** * 我是描述信息 */package com.demo.test.info;生成 JavaDoc 可以看到包的注释在说明列中使用注解修饰包假如某个包下、我们希望所有的返回值都应该非 Null、并且当我们编码的
2022-05-14 10:29:38
702
原创 Mybatis SqlSource
ublic interface SqlSource { BoundSql getBoundSql(Object parameterObject);}BoundSql 包含了解析之后的 SQL 语句(sql 字段)、每个“#{}”占位符的属性信息(parameterMappings 字段 ,List 类型)、实参信息(parameterObject 字段)以及 DynamicContext 中记录的 KV 信息(additionalParameters 集合,Map<String, O.
2022-05-14 08:15:00
667
原创 Mybatis 解释 mapper 文件
我们知道 Mybatis 在解释配置文件的时候使用的是 XMLConfigBuilder、在解释 mapper 标签的时候、为每个 Mapper.xml 文件创建一个 XMLMapperBuilder 实例解释 mapper 文件。public void parse() { if (!configuration.isResourceLoaded(resource)) { configurationElement(parser.evalNode("/mapper")); configu.
2022-05-13 10:00:00
826
原创 Mybatis SqlNode
我们在以前的文章中曾经介绍过 OGNL 强大的表达式引擎我们知道在 BaseExecutor#query 中@Overridepublic <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException { BoundSql boundSql = ms.getBoundSql(param.
2022-05-13 08:30:00
386
原创 Mybatis 解释配置文件
我们知道 Mybatis 的入口是 SqlSessionFactoryBuilderpublic SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return bu.
2022-05-12 22:53:47
346
原创 Mybatis 缓存与装饰模式
装饰模式是一种结构型设计模式、允许你通过将对象放入包含行为的特殊封装对象中来为原来帝乡绑定新的行为。俗称套娃。装饰模式中、封装器实现了与其封装对象相同的接口、封装器的成员变量可以是该接口的任意实现。Mybatis 中的装饰模式Cache 接口是 Mybatis 缓存中顶层的抽象接口、定义了 Mybatis 缓存最核心最基础的行为public interface Cache { String getId(); void putObject(Object key, Object va.
2022-05-12 22:51:20
214
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人