自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 收藏
  • 关注

原创 根据文本自动生成UML时序图(draw.io格式)-支持自动换行

1. 前言已有一些工具可以根据文本自动生成UML时序图,如PlantUML(https://plantuml.com/zh/)、Mermaid(https://mermaid-js.github.io/mermaid/)等。但存在一些使用不便之处,例如激活需要手工指定、语法较复杂,不便于记忆、部分功能使用频率较低、不便于人工继续编辑、展示的样式与常见的UML时序图不同等。因此使用Java开发了以下根据文本自动生成UML时序图的工具,激活能够自动生成、语法简单便于记忆,支持大部分UML时序图的功能、生成d

2021-10-02 22:43:14 22033 10

原创 Java方法完整调用链生成工具

1. 前言在很多场景下,如果能够生成Java代码中方法之间的调用链,是很有帮助的。IDEA提供了显示调用指定Java方法向上的完整调用链的功能,可以通过“Navigate -> Call Hierarchy”菜单(快捷键:Ctrl+Alt+H)使用;Eclipse也提供了相同的功能。但以上都需要针对每个方法进行手工处理,拷贝出来的文本无法展示调用层级,且不支持生成指定Java方法向下的完整调用链。以下实现了一个工具,能够批量生成指定Java方法向下的完整调用链,对于关注的Java方法,能够生成其

2021-07-05 02:06:22 28583 45

原创 万字解析MySQL索引原理——InnoDB索引结构与读取

1. 前言以下对InnoDB索引的结构与读取方式进行了整理,分析MySQL索引使SQL语句执行加速的原理,针对使用InnoDB 5.6版本的MySQL。2. InnoDB索引结构与读取方式总结InnoDB索引结构与读取方式总结可总结如下:InnoDB的索引使用B+树结构,非叶子节点保存指向非叶子节点或叶子节点的指针,在叶子节点保存真正的数据,叶子节点在最低的同一层级,相互之间形成了双向链表。B+树中的记录是有序的,在B+树中查找一条记录的时间复杂度为O(logbn),b为B+树的内部节点的

2020-08-18 09:33:21 1745

原创 Java单元测试实践-00.汇总(9万多字文档+700多测试示例)

1. 前言以下内容提供了Java单元测试实践总结,包含9万多字文档,与700多个测试示例。2. 相关文档地址01.单元测试概述与示例02.JUnit使用03.spring-test使用04.使用IDE执行单元测试05.Mockito、PowerMock基本使用06.Mock后Stub静态方法07.Answer与未Stub的静态方法08.Stub、Replace、Suppress静态方法09.Mockito的Stub参数条件10.非静态方法Moc

2020-08-12 23:37:20 5353 5

原创 Java创建进程读取Process.getInputStream阻塞问题

在某个 k8s pod 中,通过 Java 代码创建进程执行其他程序时,被阻塞了很久。

2025-01-26 12:58:33 851

原创 Java反射导致Metaspace OOM分析方式、工具与解决方法

反射膨胀机制对同一个方法重复生成类的情况,出现在为某个类的构造函数生成 GeneratedConstructorAccessor… 类,或为非构造函数方法生成 GeneratedMethodAccessor… 类的阶段,当方法对应的类生成完毕以后,后续再通过反射调用该方法时,会使用已经生成好的类,不会再继续生成类,即不会无限为同一个方法重复生成类因此,反射膨胀机制对同一个方法重复生成类的情况,一定程度上可能导致占用 Metaspace 空间进一步增大,具体比例与 Java 应用处理请求的并发有关。

2024-12-31 23:23:22 988

原创 Java通过反射调用方法源码分析

当前方法通过反射调用次数大于 JVM 参数 sun.reflect.inflationThreshold 值时,会为对应的方法生成类,并将该类赋值到对应的 DelegatingMethodAccessorImpl 类的 delegate 字段;即后续都会调用生成的类的方法。

2024-12-31 22:25:21 736

原创 获取Java反射生成的GeneratedMethodAccessor等类的原始方法

在分析 Java Metaspace OOM 问题时,可能需要获取 Java 反射生成的 sun.reflect.GeneratedMethodAccessor…、sun.reflect.GeneratedConstructorAccessor…、sun.reflect.GeneratedSerializationConstructorAccessor… 类对应的原始方法目前可以使用的方法步骤相对较多,耗时很长,因此开发了简化的工具快速获取。

2024-12-31 22:11:37 1029

原创 Git批量操作脚本-检查分支合并、合并分支创建TAG等

以下实现了 Git 批量操作脚本,可以针对某个目录下的所有 Git 本地仓库进行快速批量操作不依赖 Git 外的额外环境支持在任意目录使用对应命令支持 TAB 键补全命令与参数。

2024-11-02 17:52:08 796

原创 TortoiseGit Revision graph快速打开方式

在 Windows 环境下,假如要打开 TortoiseGit 的 Revision graph 窗口,操作不是很方便,需要先在资源管理器中 Git 本地仓库对应的目录图标上或目录空白处点击鼠标右键,点击 TortoiseGit 菜单,再点击 Revision graph 菜单假如有很多 Git 本地仓库都需要打开 Revision graph 窗口,以上操作就更加费时通过以下方式可以实现快速打开 TortoiseGit Revision graph 窗口。

2024-11-02 17:44:50 490

原创 Java线程池关闭、等待、线程结束与JVM退出

线程池关闭后的操作执行结果 / 线程池关闭方式对正在执行任务的影响没有影响线程会被中断是否丢弃队列中的任务不丢弃丢弃是否等待存量任务执行完毕不等待不等待使用 awaitTermination() 方法等待结束的任务范围正在执行的任务 + 队列中的任务正在执行的任务继续执行任务使用拒绝策略处理任务使用拒绝策略处理任务活跃线程结束方式任务执行完毕后结束1. 线程被中断后结束2. 任务执行完毕后结束空闲线程结束方式线程被中断后结束线程被中断后结束。

2024-09-27 20:33:29 1449 1

原创 text2sql框架-DB-GPT使用总结

DB-GPT 是一个开源的 AI 原生数据应用开发框架。

2024-07-13 20:20:51 1679

原创 text2sql框架-vanna使用总结

ChromaDB_VectorStore、MyCustomLLM、MyVanna 类都通过 config 接收使用的配置参数在创建 MyVanna 类时,可通过 config 传递配置参数MODEL_URL = "模型接口的 URL,http://xxx"MODEL = "模型名称"API_KEY = "模型提供的 API KEY"CHROMADB_PATH = "保存 ChromaDB 数据库文件的目录路径"

2024-07-13 20:19:37 4046

原创 MyBatis拦截器动态注册

MyBatis拦截器动态注册

2024-06-02 23:10:03 1093

原创 Druid过滤器动态注册

Druid过滤器动态注册方式

2024-06-02 23:08:07 690

原创 Spring Bean创建顺序与@Order注解

Spring Bean创建顺序,及@Order注解等可以控制的顺序

2024-06-01 12:06:52 1336 3

原创 MySQL、MariaDB、TiDB时间小数秒四舍五入与截断

在 Java 代码中将某个时间以 String、long 格式在不同系统间传递时,假如不同系统使用的数据库对超过精度时间小数秒的处理不同,当以上时间的小数部分大于等于 0.5 秒时,不同系统记录的同一个时间会相差 1 秒。假如在某系统的 Java 代码中将 Date 类型的时间写入 MySQL/TiDB 数据库精度为秒的 DATETIME、TIMESTAMP 等字段,则大约一半的时间为当前时间,一半的时间为下一秒。MariaDB 在插入时间时假如超过字段的精度,会进行截断,不会进行四舍五入。

2023-12-08 21:02:00 1357

原创 MyBatis SqlSession事务与批量执行正确方式(默认不生效)

某些情况下会使用MyBatis的SqlSessionFactory.openSession()方法获取SqlSession对象,再进行数据库操作,但默认情况下SqlSession的事务与批量执行均不生效,假如希望使用SqlSession时事务或批量执行能够生效,则需要进行额外的处理。

2023-03-06 20:28:02 13286 2

原创 MySQL中Spring管理的事务开启后不提交引起的事故

了解到一个事故,在MySQL数据库中,使用Spring管理的事务在开启以后没有在操作结束时提交或回滚,使得原有线程在后续执行数据库操作时可能继续使用原有事务,且不会提交,导致对数据库的修改在Java应用层认为是成功,但在数据库层最终是没有生效的,产生了比较严重的后果

2023-01-28 21:53:13 8827 5

原创 解析MyBatis XML中的数据库表名(支持MySQL)

当前项目用于解析MyBatis XML文件中sql语句使用的数据库表名,支持使用MySQL数据库(或兼容MySQL协议的数据库)的情况。

2023-01-01 18:00:25 1925 2

原创 Jackson @JsonProperty重复字段处理

使用Jackson进行JSON序列化时,假如通过@JsonProperty注解指定了重复的字段(Java中的字段名称不同,但@JsonProperty注解属性中的名称相同),在不同情况下会有不同的结果,以下进行分析。以下使用的Jackson版本为2.14.0。

2022-11-25 20:43:49 3577

原创 数据源使用错误导致MySQL事务失效分析

在Java应用中使用MySQL数据库时,可能出现因为使用的数据源或数据库会话错误,导致事务失效的问题。在Java应用中使用多数据源时,可能在执行SQL语句的不同阶段使用了不相同的数据源,导致事务失效,以下主要对此类问题进行分析。...

2022-08-27 22:41:53 1796

原创 Spring、MyBatis、Druid、MySQL执行SQL语句与事务监控

Druid支持使用自定义Filter,可对SQL语句与事务执行按照需要进行监控。使用Druid自定义Filter监控SQL语句与事务执行的效果,可参考“数据源使用错误导致MySQL事务失效分析”。在Spring XML中,可通过以下方式,在“com.alibaba.druid.pool.DruidDataSource”对应的bean中配置Druid自定义Filter。上类FilterEventAdapter为FilterAdapter的子类。...

2022-08-27 22:39:35 1672

原创 Spring、MyBatis、Druid、MySQL使用事务执行SQL语句分析

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。...

2022-08-27 22:38:10 1395

原创 Spring、MyBatis、Druid、MySQL不使用事务执行SQL语句分析

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。在Java应用中访问MySQL服务时,涉及Java应用、

2022-08-27 22:36:40 1814

原创 TiDB乐观事务、悲观事务模型验证

TiDB与MySQL中的事务处理并不完全相同,以下在TiDB事务中执行select for update与update语句,使用数据库进行锁控制,对TiDB不同条件下事务执行情况进行分析与验证。

2022-08-27 22:34:27 1663

原创 tcpdump、Wireshark抓包分析MySQL SQL语句与事务执行

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。...

2022-08-27 22:32:56 6216

原创 MySQL SQL语句与事务执行及日志分析

在事务的执行过程中,Java应用(MySQL客户端)、MySQL服务、存储引擎,这三者需要共同参与,都需要知道当前是否使用了事务,以及事务的当前状态。自动提交是MySQL的会话参数,默认为是,即MySQL执行SQL语句时,默认会自动提交。MySQL在事务中执行SQL时,包含三个步骤:执行START TRANSACTION或SET autocommit=0等语句,以开启事务;执行需要在事务中执行的SQL语句;执行COMMIT以提交事务;或执行ROLLBACK以回滚事务。...

2022-08-27 22:29:00 2413 2

原创 MySQL数据库字段超长问题

在向MySQL数据库表中插入或更新记录时,有时会出现字段超长的问题,包括但不限于以下场景处理上游系统发送的交易信息,将多个字段拼成一个JSON或其他格式的字符串;在增加字段,或数据较长时,写入或更新数据库时可能超长;调用下游系统的服务,返回的部分字段(如错误信息等)较长时,导致更新数据库记录失败。...

2022-07-30 15:52:42 12670

原创 MySQL二级索引中的主键——MySQL存在大量相同数据分页查询优化

以下主要分析,当存在大量相同数据时,分页查询如何通过二级索引中主键进行优化。

2022-07-25 21:34:51 1388

原创 Java类初始化失败后出现NoClassDefFoundError分析

一次遇到一个问题,在调用Java静态方法时,出现了NoClassDefFoundError异常,通常该异常在找不到类时才会出现,实际上对应的类就在当前项目中,对这个比较奇怪的异常进行了分析。

2022-06-12 23:07:30 3330

原创 Java定时任务手工触发-使用Arthas

1. 前言在测试环境经常需要手工触发Java应用中的定时任务,如果定时任务没有使用Quartz,Java应用中也没有提供其他方法手工触发定时任务,可以使用Arthas快速实现以上目的。以下使用Arthas动态触发Java定时任务的前提是:定时任务类为Spring Bean,Java项目中存在公共静态方法可以获取到Spring Context,如以下使用的SpringContextUtil类的getSpringContext()方法,代码见附录。2. Arthas使用说明2.1. 官方文档https

2021-05-21 20:03:18 2050 1

原创 Tomcat接收请求超过处理能力现象及代码分析

1. 前言参考“The HTTP Connector”(http://tomcat.apache.org/tomcat-8.5-doc/config/http.html#Introduction),描述了当Tomcat接收到新的请求,直到超过Tomcat处理能力时,Tomcat的处理过程,涉及到三个相关的属性:maxThreads、maxConnections、acceptCount。Tomcat的每个请求的持续期间,都需要一个线程。如果当前存在的用来处理请求的线程不足以处理接收到的并发请求,将会创

2021-03-31 20:15:59 3997

原创 Tomcat因Acceptor线程终止无法访问分析

1. 问题发现某次网页打不开,开始进行分析。查看系统对应的Tomcat应用进程存在,Tomcat的HTTP端口有在监听,怀疑是Tomcat某个处理HTTP服务的线程出现问题。根据客户端IP定位到对应的服务器实例,与其他能够正常访问的服务器的线程相比,发现少了部分线程:http-nio-xxx-Acceptor-0、http-nio-xxx-AsyncTimeout、http-nio-xxx-ClientPoller-0、http-nio-xxx-ClientPoller-1等。重启Tomcat进程后,

2021-03-31 20:14:28 3873 1

原创 HTTP keep-alive及Tomcat配置分析

1. HTTP协议关于keep-alive的说明参考“Hypertext Transfer Protocol – HTTP/1.1-8.1 Persistent Connections”( https://tools.ietf.org/html/rfc2616#section-8.1 )。在持久化连接出现之前,每次访问URL都需要建立一个独立的TCP连接,会增加HTTP服务器的负载,并导致网络拥塞。持久的HTTP连接有一些优势,例如打开与关闭的TCP连接会减少,可以减少中间经过节点的CPU时间及内存等

2021-03-31 20:13:54 4919

原创 查找Java项目未使用的Jar包及代码调用关系

1. 前言Java项目中经常会引入一些未使用的Jar包,会增大项目发布包体积,也可能会带来一些额外的维护成本。通过手工方式查找未使用的Jar包,是一件费时费力的事。以下提供Linux环境shell脚本(编写环境为GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)),用于快速自动化查找Java项目引入但未使用的Jar包,以及Jar包中的代码相互之间的调用关系。相关脚本可从以下地址下载:https://github.com/Adrn

2021-01-27 21:15:23 4925 2

原创 查找Java项目引入Jar包中的重复同名类

1. 前言当Java项目中引入的不同Jar包中存在重复同名类时,可能在不同情况下使用不同的加载顺序,导致生效的类不相同,可能会因此出现事故。尽早发现Java项目中引入Jar包的重复同名类并解决,可以避免事故发生。以下提供Linux环境shell脚本(编写环境为GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)),用于查找Java项目中引入的Java包中存在的重复同名类,并比较相关类文件的HASH值是否相同。以下脚本会查找包名非空,

2021-01-27 21:10:03 4633 1

原创 MySQL快速比较数据库表数据

1. 前言有时需要比较MySQL不同数据库间结构相同的表数据是否相同,例如在测试环境与生产环境之间比较,或多个测试环境之间比较,以下提供一种通用的快速比较方式。2. 比较方法对于需要比较数据的数据库表,将每行中关心的字段进行拼接,计算其HASH值;再根据主键或其他字段对每行的HASH值进行排序,并将每行的HASH值拼接,对拼接结果计算最终的HASH值。在比较MySQL不同数据库间结构相同的表数据是否相同时,比较以上HASH值即可。若最终的HASH值不同,则说明数据库表中的数据不同;若最终的HASH值

2021-01-27 21:07:56 4319

原创 MySQL索引优化相关原理

1. 前言以下对MySQL索引的优化相关原理进行了整理,分析MySQL索引使SQL语句执行加速的原理,针对使用InnoDB 5.6版本的MySQL。关于索引条件下推的概念,可参考“MySQL如何执行查询语句”,有关于MySQL Server层与存储引擎的关系。2. MySQL索引优化相关原理2.1. MySQL索引的作用及注意事项参考 https://dev.mysql.com/doc/refman/5.6/en/optimization-indexes.html 。提升SELECT操作性能的最

2020-08-18 09:43:33 278

原创 MySQL索引分析除了EXPLAIN还有什么方法

1. 前言对于非数据库开发人员而言,难以对MySQL源码进行分析或调试,接近一个黑盒,但MySQL提供了一些命令及系统状态变量,可对索引及其他内容进行分析。掌握这些方法后,可以尽量深入地了解MySQL的一些实现细节。2. MySQL索引分析除了EXPLAIN还有什么方法通过以下方法,可以获得MySQL索引相关的数据,便于分析与理解索引相关的问题。2.1. 通过慢查询日志记录SQL语句执行时间参考 https://dev.mysql.com/doc/refman/5.6/en/slow-query-

2020-08-18 09:42:29 2430

空空如也

空空如也

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

TA关注的人

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