Java
文章平均质量分 90
Java相关
adrninistrat0r
这个作者很懒,什么都没留下…
展开
-
Java线程池关闭、等待、线程结束与JVM退出
线程池关闭后的操作执行结果 / 线程池关闭方式对正在执行任务的影响没有影响线程会被中断是否丢弃队列中的任务不丢弃丢弃是否等待存量任务执行完毕不等待不等待使用 awaitTermination() 方法等待结束的任务范围正在执行的任务 + 队列中的任务正在执行的任务继续执行任务使用拒绝策略处理任务使用拒绝策略处理任务活跃线程结束方式任务执行完毕后结束1. 线程被中断后结束2. 任务执行完毕后结束空闲线程结束方式线程被中断后结束线程被中断后结束。原创 2024-09-27 20:33:29 · 780 阅读 · 0 评论 -
Druid过滤器动态注册
Druid过滤器动态注册方式原创 2024-06-02 23:08:07 · 626 阅读 · 0 评论 -
MyBatis拦截器动态注册
MyBatis拦截器动态注册原创 2024-06-02 23:10:03 · 975 阅读 · 0 评论 -
Spring Bean创建顺序与@Order注解
Spring Bean创建顺序,及@Order注解等可以控制的顺序原创 2024-06-01 12:06:52 · 1078 阅读 · 3 评论 -
MySQL、MariaDB、TiDB时间小数秒四舍五入与截断
在 Java 代码中将某个时间以 String、long 格式在不同系统间传递时,假如不同系统使用的数据库对超过精度时间小数秒的处理不同,当以上时间的小数部分大于等于 0.5 秒时,不同系统记录的同一个时间会相差 1 秒。假如在某系统的 Java 代码中将 Date 类型的时间写入 MySQL/TiDB 数据库精度为秒的 DATETIME、TIMESTAMP 等字段,则大约一半的时间为当前时间,一半的时间为下一秒。MariaDB 在插入时间时假如超过字段的精度,会进行截断,不会进行四舍五入。原创 2023-12-08 21:02:00 · 1201 阅读 · 0 评论 -
MyBatis SqlSession事务与批量执行正确方式(默认不生效)
某些情况下会使用MyBatis的SqlSessionFactory.openSession()方法获取SqlSession对象,再进行数据库操作,但默认情况下SqlSession的事务与批量执行均不生效,假如希望使用SqlSession时事务或批量执行能够生效,则需要进行额外的处理。原创 2023-03-06 20:28:02 · 11438 阅读 · 2 评论 -
MySQL中Spring管理的事务开启后不提交引起的事故
了解到一个事故,在MySQL数据库中,使用Spring管理的事务在开启以后没有在操作结束时提交或回滚,使得原有线程在后续执行数据库操作时可能继续使用原有事务,且不会提交,导致对数据库的修改在Java应用层认为是成功,但在数据库层最终是没有生效的,产生了比较严重的后果原创 2023-01-28 21:53:13 · 8021 阅读 · 4 评论 -
解析MyBatis XML中的数据库表名(支持MySQL)
当前项目用于解析MyBatis XML文件中sql语句使用的数据库表名,支持使用MySQL数据库(或兼容MySQL协议的数据库)的情况。原创 2023-01-01 18:00:25 · 1707 阅读 · 1 评论 -
Jackson @JsonProperty重复字段处理
使用Jackson进行JSON序列化时,假如通过@JsonProperty注解指定了重复的字段(Java中的字段名称不同,但@JsonProperty注解属性中的名称相同),在不同情况下会有不同的结果,以下进行分析。以下使用的Jackson版本为2.14.0。原创 2022-11-25 20:43:49 · 3202 阅读 · 0 评论 -
数据源使用错误导致MySQL事务失效分析
在Java应用中使用MySQL数据库时,可能出现因为使用的数据源或数据库会话错误,导致事务失效的问题。在Java应用中使用多数据源时,可能在执行SQL语句的不同阶段使用了不相同的数据源,导致事务失效,以下主要对此类问题进行分析。...原创 2022-08-27 22:41:53 · 1695 阅读 · 0 评论 -
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 · 1590 阅读 · 0 评论 -
Spring、MyBatis、Druid、MySQL使用事务执行SQL语句分析
使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。...原创 2022-08-27 22:38:10 · 1332 阅读 · 0 评论 -
Spring、MyBatis、Druid、MySQL不使用事务执行SQL语句分析
使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。在Java应用中访问MySQL服务时,涉及Java应用、原创 2022-08-27 22:36:40 · 1672 阅读 · 0 评论 -
MySQL数据库字段超长问题
在向MySQL数据库表中插入或更新记录时,有时会出现字段超长的问题,包括但不限于以下场景处理上游系统发送的交易信息,将多个字段拼成一个JSON或其他格式的字符串;在增加字段,或数据较长时,写入或更新数据库时可能超长;调用下游系统的服务,返回的部分字段(如错误信息等)较长时,导致更新数据库记录失败。...原创 2022-07-30 15:52:42 · 11727 阅读 · 0 评论 -
Java类初始化失败后出现NoClassDefFoundError分析
一次遇到一个问题,在调用Java静态方法时,出现了NoClassDefFoundError异常,通常该异常在找不到类时才会出现,实际上对应的类就在当前项目中,对这个比较奇怪的异常进行了分析。原创 2022-06-12 23:07:30 · 3005 阅读 · 0 评论 -
根据文本自动生成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 · 19253 阅读 · 10 评论 -
Java方法完整调用链生成工具
1. 前言在很多场景下,如果能够生成Java代码中方法之间的调用链,是很有帮助的。IDEA提供了显示调用指定Java方法向上的完整调用链的功能,可以通过“Navigate -> Call Hierarchy”菜单(快捷键:Ctrl+Alt+H)使用;Eclipse也提供了相同的功能。但以上都需要针对每个方法进行手工处理,拷贝出来的文本无法展示调用层级,且不支持生成指定Java方法向下的完整调用链。以下实现了一个工具,能够批量生成指定Java方法向下的完整调用链,对于关注的Java方法,能够生成其原创 2021-07-05 02:06:22 · 25732 阅读 · 44 评论 -
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 · 1911 阅读 · 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 · 3564 阅读 · 0 评论 -
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 · 3548 阅读 · 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 · 4443 阅读 · 0 评论 -
查找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 · 4568 阅读 · 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 · 4441 阅读 · 1 评论 -
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 · 3328 阅读 · 0 评论 -
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 · 517 阅读 · 0 评论 -
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 · 2634 阅读 · 0 评论 -
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 · 10538 阅读 · 0 评论 -
Java单元测试实践-20.Mock相关总结
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 单元测试Mock代码编写建议按场景编写单元测试在编写单元测试代码前,建议先详细整理对应交易的场景,可以使用思维导图或其他方式,再以此为基础,选择需要编写单元测试的场景,尽量覆盖全部的场景。像业务代码一样编写单元测试代码在编写单元测试代码时,应该像业务代码一样,对Mock代码进行封装,合理使用继承与多态,划原创 2020-08-15 22:18:31 · 2217 阅读 · 0 评论 -
Java单元测试实践-25.在本地使用H2数据库进行单元测试
使用CI/CD可以实现按照要求自动执行单元测试,例如定期执行某个项目的单元测试。当在CI服务器执行单元测试时,CI服务器有可能无法访问数据库服务器。可以使用H2数据库,使执行单元测试时不依赖数据库服务器。使用H2数据库执行单元测试的其他优势是,不会在数据库服务器中产生脏数据。以下说明在单元测试中如何在本地使用H2数据库,摆脱对数据库服务器的依赖,帮助单元测试执行支持自动化。原创 2020-08-15 22:13:15 · 9880 阅读 · 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 · 2971 阅读 · 0 评论 -
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 · 3548 阅读 · 0 评论 -
Java单元测试实践-22.Gradle资源文件与配置参数动态替换
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Gradle资源文件与配置参数动态替换1.1. main模块与test模块资源文件Gradle任务processResources、processTestResources分别用于复制main模块与test模块的资源文件。1.1.1. 输入输出文件在processResources、processTestReso原创 2020-08-15 22:09:34 · 2134 阅读 · 0 评论 -
Java单元测试实践-14.Mock、Spy后Stub Spring成员变量中的方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Mock/Spy后Stub Spring成员变量中的方法在被测试代码中,Spring的@Component组件实现类中通常会依赖其他的成员变量,可能存在多层的依赖关系。为了使被测试代码能够完成足够完备的测试,覆盖足够的场景与代码分支,需要对被测试代码进行细粒度的控制,可能需要对成员变量的方法进行Stub。例如被测试代原创 2020-08-15 22:07:56 · 1758 阅读 · 0 评论 -
Java单元测试实践-08.Stub、Replace、Suppress静态方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Stub、Replace、Suppress静态方法以下主要说明,如何使用PowerMockito对静态方法进行Stub、Replace,以及对静态方法所在的类进行Suppress。1.1. 对静态方法进行Stub使用PowerMockito.stub()方法支持对静态方法进行Stub。当间接调用被Stub方法时,原创 2020-08-15 22:06:45 · 3358 阅读 · 0 评论 -
Java单元测试实践-04.使用IDEA、Eclipse执行单元测试
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 使用IDE执行单元测试使用IDE执行单元测试是常见的执行方式,以下针对IntelliJ IDEA与Eclipse进行说明。1.1. IntelliJ IDEA1.1.1. 支持的功能直接执行测试类在IDEA中可直接通过Run或Debug执行测试类,会自动添加-ea参数( 参考 https://docs.or原创 2020-08-15 22:04:51 · 1361 阅读 · 0 评论 -
Java单元测试实践-01.单元测试概述与示例
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 前言以下内容为本人以开发人员的视角,在平时进行单元测试过程中的总结。主要内容为通用的,不限制具体业务场景的单元测试实践总结。由于能力有限,经验不足,难免会有差错存在,希望与大家一起探讨。2. 示例工程以下所述示例工程为UnitTest,地址为( https://github.com/Adrninistrator/U原创 2020-08-15 21:46:59 · 2518 阅读 · 0 评论 -
Java单元测试实践-19.Mockito与PowerMock的其他功能
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Mockito与PowerMock的其他功能1.1. 获取Mock对象详细信息Mockito提供了用于获取Mock对象详细信息的API,可参考 https://static.javadoc.io/org.mockito/mockito-core/latest/org/mockito/Mockito.html#mock原创 2020-08-13 00:27:16 · 3567 阅读 · 0 评论 -
Java单元测试实践-18.使用注解进行Stub、Replace、Suppress
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. 使用@MockPolicy注解进行Stub、Replace、Suppress@MockPolicy注解的说明可参考 https://javadoc.io/doc/org.powermock/powermock-core/latest/org/powermock/core/classloader/annotations/原创 2020-08-13 00:26:05 · 676 阅读 · 0 评论 -
Java单元测试实践-17.Mybatis与Mock
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Mybatis与Mock在对Mybatis的Mapper对象进行处理时,可能需要使某个Mapper对象在某些情况下返回指定值,在某些情况下执行真实方法;或者需要对Mapper对象相关的数据库操作进行记录,以下进行说明。1.1. 测试示例说明与Mybatis相关的测试类在测试示例的adrninistrator.tes原创 2020-08-13 00:25:05 · 8015 阅读 · 0 评论 -
Java单元测试实践-16.Spring AOP与Mock
Java单元测试实践-00.目录(9万多字文档+700多测试示例)https://blog.csdn.net/a82514921/article/details/1079693401. Spring AOP与Mock以下示例使用CGLIB代理,或JDK动态代理,执行结果相同。以下使用注解的方式设置AOP,对方法或自定义注解设置AOP的效果相同。后续内容在设置AOP,对方法设置了AOP。对自定义注解设置AOP的处理可参考示例TestSpAOPARawGet、TestSpAOPARun类。1.1.原创 2020-08-13 00:24:20 · 2481 阅读 · 0 评论