自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2021-07-05 02:06:22 21853 43

原创 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 2207

原创 万字解析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 1404

原创 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 4754 5

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

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

2023-12-08 21:02:00 1018

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

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

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

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

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

2023-01-28 21:53:13 6412 4

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

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

2023-01-01 18:00:25 1430

原创 Jackson @JsonProperty重复字段处理

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

2022-11-25 20:43:49 2596

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

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

2022-08-27 22:41:53 1486

原创 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 1454

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

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

2022-08-27 22:38:10 1197

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

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

2022-08-27 22:36:40 1350

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

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

2022-08-27 22:34:27 1084

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

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

2022-08-27 22:32:56 4324

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

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

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

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

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

2022-07-30 15:52:42 10583

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

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

2022-07-25 21:34:51 1113

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

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

2022-06-12 23:07:30 2579

原创 根据文本自动生成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 16221 10

原创 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 1787 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 3031

原创 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 3126 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 3653

原创 查找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 4049 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 4153 1

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

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

2021-01-27 21:07:56 3357

原创 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 210

原创 MySQL索引失效与解决方法实践

1. 前言以下测试使用MariaDB,版本为10.0.36,InnoDb版本为5.6.39-83.1。2. 测试用数据库表说明以下用于测试的数据库表为test_table_log、test_table_log2,两个表的字段相同,索引不同,如下所示:CREATE TABLE IF NOT EXISTS test_table_log( id varchar(32) NOT NULL COMMENT 'id', type varchar(20)

2020-08-18 09:41:31 891

原创 MySQL查询操作索引优化实践

1. 前言以下测试使用MariaDB,版本为10.0.36,InnoDb版本为5.6.39-83.1。以下针对索引的优化方法可参考“MySQL索引优化相关原理”。以下对索引的分析方法可参考“MySQL索引分析除了EXPLAIN还有什么方法”。2. 测试用数据库表说明以下用于测试的数据库表为test_table_log、test_table_log2,两个表的字段相同,索引不同,如下所示:CREATE TABLE IF NOT EXISTS test_table_log( id

2020-08-18 09:40:45 192

原创 MySQL limit分页查询优化实践

1. 前言以下测试使用MariaDB,版本为10.0.36,InnoDb版本为5.6.39-83.1。以下分页查询优化针对OLTP交易场景。以下对索引的分析方法可参考“MySQL索引分析除了EXPLAIN还有什么方法”。2. limit offset分页查询的问题使用limit offset方式进行分页查询时,存在以下问题:需要读取的记录数太多当使用limit offset方式进行分页查询时,偏移量对应的行数也会被读取,不会被跳过,当偏移量较大时,读取效率较低。例如查询语句使用“limi

2020-08-18 09:39:29 697

原创 MySQL如何执行查询语句

1. 前言以下对MySQL执行查询语句的主要步骤进行分析,未涉及连接优化、排序优化等内容。2. MySQL服务器架构在了解MySQL如何执行查询语句前,首先需要了解MySQL服务器(MySQL Server)架构。MySQL服务器架构示意图如下所示:图片来源: https://www.oracle.com/technetwork/articles/javase/figure2-large-145676.jpg 。图片来源: 《High Performance MySQL, 3rd Editio

2020-08-18 09:34:36 498

原创 Java单元测试实践-28.spring-test数据库操作自动回滚处理

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. spring-test数据库操作自动回滚处理在进行单元测试时,可以使用spring-test提供的支持,使执行单元测试时的数据库操作使用事务,在测试方法结束时可以回滚数据库操作。通过上述方法,可以使执行单元测试时不对数据库数据产生影响,也存在一些例外场景需要具体分析。1.1. spring-test提供的事务相关类

2020-08-16 19:54:55 3015

原创 Java单元测试实践-27.JPA Entity生成工具Java组件增强版

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 前言以下提供了根据数据库表生成JPA Entity的Java组件,项目地址为 https://github.com/Adrninistrator/jpa-entity-generator-enhance ,在原始项目 https://github.com/smartnews/jpa-entity-generator 基

2020-08-16 19:52:07 461

原创 Java单元测试实践-26.使用JPA自动创建数据库表

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 使用JPA自动创建数据库表以上在单元测试中使用H2数据库的方法,需要在连接数据库时指定数据库建表语句,建表语句需要从数据库服务器获取,由于不同的数据库建表语句存在一些差别,可能并不能直接在H2数据库中使用(如前文所述MySQL建表语句中H2数据库中存在部分不支持),不是最佳的选择。可以在单元测试中使用JPA,利用JP

2020-08-16 19:50:51 2419

原创 Java单元测试实践-21.使用Gradle执行单元测试

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 使用Gradle执行单元测试当需要使单元测试执行支持自动化时,需要选择合适的构建工具,以下说明如何使用Gradle支持单元测试自动化执行。1.1. Gradle test任务参考 https://docs.gradle.org/current/userguide/java_testing.html#sec:java

2020-08-15 22:19:42 9587

原创 Java单元测试实践-20.Mock相关总结

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 单元测试Mock代码编写建议按场景编写单元测试在编写单元测试代码前,建议先详细整理对应交易的场景,可以使用思维导图或其他方式,再以此为基础,选择需要编写单元测试的场景,尽量覆盖全部的场景。像业务代码一样编写单元测试代码在编写单元测试代码时,应该像业务代码一样,对Mock代码进行封装,合理使用继承与多态,划

2020-08-15 22:18:31 2034

原创 Java单元测试实践-25.在本地使用H2数据库进行单元测试

使用CI/CD可以实现按照要求自动执行单元测试,例如定期执行某个项目的单元测试。当在CI服务器执行单元测试时,CI服务器有可能无法访问数据库服务器。可以使用H2数据库,使执行单元测试时不依赖数据库服务器。使用H2数据库执行单元测试的其他优势是,不会在数据库服务器中产生脏数据。以下说明在单元测试中如何在本地使用H2数据库,摆脱对数据库服务器的依赖,帮助单元测试执行支持自动化。

2020-08-15 22:13:15 8942 1

原创 Java单元测试实践-24.Gradle执行test任务卡死问题解决

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Gradle执行test任务卡死问题解决1.1. test任务卡死问题现象使用Gradle test任务执行单元测试时,执行一段时间后卡死,通过testLogging参数指定的测试日志查看,执行了几十个测试类后不再继续执行。1.1.1. 无效的解决方法1.1.2. 与Gradle版本的关系使用Gradle 4.

2020-08-15 22:12:03 2721

原创 Java单元测试实践-23.Gradle单元测试日志、报告与JaCoCo代码覆盖率

Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Gradle测试日志、报告与覆盖率1.1. 测试日志参考 https://docs.gradle.org/current/userguide/java_testing.html#sec:test_execution ,或 https://docs.gradle.org/current/dsl/org.gradle.a

2020-08-15 22:10:42 3094

空空如也

空空如也

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

TA关注的人

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