- 博客(72)
- 收藏
- 关注
原创 生产服务间隔6分钟就会有超1S交易的问题排查解决
但是,还是存在超1s的交易,通过观察单台应用发现每隔6分钟大约就会有超时的,由于我们使用的是mina框架,处理请求的线程设置是150个,使用arthas的thread命令抓取线程阻塞,没有抓到(事后发现是因为阻塞时间太短,手动敲命令后很难抓到,而且间隔6分钟大概才阻塞)。首先,排除是否是有不合理的定时任务,每次6分钟执行,同时执行时可能是锁表等操作引起阻塞,通过查看定时配置和定时的代码,发现确实有俩任务,其中有个任务涉及到加锁操作,但是定时时间是每天执行一次,所以排除掉。其次,查看是否是GC引起的停顿。
2024-02-27 14:43:48
437
原创 查看公私钥证书的过期时间
#在证书文件目录下执行下面命令 查询名称为 cer格式的文件,取 name 属性值作为 openssl命令的参数find ./ -name "*.cer" |xargs -i openssl x509 -in {} -noout -dates#如果证书文件少,可以直接查看这个证书的时间:openssl x509 -in acp_prod_verify.cer -noout -dates 查看私钥证书的过期时间:我们可以先从私钥证书中提取出公钥证书,然后查看公钥证书的过期时间# 从pf.
2022-03-11 11:05:23
5330
原创 spring源码阅读--我们的第一个demo
如何写一个我们的demo?首先,新建一个模块module,使用maven构建。pom文件如下:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema...
2020-01-23 09:56:51
402
原创 Java设计原则及设计模式个人总结
七大设计原则1.开闭原则,开闭原则是总纲,我们做系统首先需要满足开闭原则。软件实体应对扩展开放,而对修改关闭。2.单一职责原则,用于控制类的粒度大小,就是我们重构时,将一个复杂的类拆分为多个类。尽可能地将一个类职责单一化。3.接口隔离原则,使用多个专门的接口,而不使用单 一的总接口,即客户端不应该依赖那些它不需要的接口。这个是关于接口定义时的指导方针,可以对比类的单一职责原则。就是要求将复...
2020-01-22 21:48:17
200
原创 spring源码阅读环境的搭建问题记录
首先,修改maven镜像 repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven { url "http://repo.springsource.org/plugins-release" } }不修改的化会出现下面问题:Could not resol...
2020-01-21 20:13:37
680
原创 Java8新特性---四大类型函数式接口
lambda表达式:将一段代码进行赋值,或入参。实质:佚名内部类Runnable接口就是一个函数式接口。常用的函数式接口:消费型接口 BiConsumer:俩个入参,无返回值Consumer :一个入参,无返回值package java.util.function;import java.util.Objects;@FunctionalInterfacepublic inte...
2020-01-14 22:45:57
627
原创 MyBatis源码的学习(23)---阶段性总结
按功能模块分:sql解析阶段sql执行阶段先看解析阶段@BeforeAllstatic void initDatabase() throws Exception { try (Reader reader = Resources.getResourceAsReader("mybatis-config.xml")) { sqlSessionFactory = new SqlS...
2020-01-12 19:17:36
177
原创 springBoot学习---从SSM的动态数据源到SpringBoot的动态数据源的实现方案二
和方案一区别:spring: datasource: primary: url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8 username: zhangzx password: 123 driverClassName: com.mysql.cj.jdbc.Dr...
2020-01-12 11:53:47
149
原创 springBoot学习---从SSM的动态数据源到SpringBoot的动态数据源的实现方案一
一共有俩中实现方案,最近方案一已经调通,记录如下:难点:如何将动态数据源的注入到sqlSessionFactory中。方案一的实现数据源的注入,依赖于注解@MapperScan,在这个注解中有下面的属性值,我们人为生成,然后注入进去。sqlSessionFactoryRef方案二的实现方式,学习我们的通用Mapper插件,采用实现接口ImportBeanDefinition...
2020-01-11 14:17:20
170
原创 MyBatis源码的学习(22)---关于#和$的区别,简单类型$中只能用value吗??
最近在整理mybatis中关于#和$的区别的时候,其中看到网上有一条是:${}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,${}中只能写成value。#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。上面加黑的部分,经过测试,不管是$还是#,单个参数...
2020-01-08 11:04:44
485
原创 springBoot整合通用Mapper插件的源码简单解读
本篇主要是简单讲解,通用Mapper的实现原理,不是整合教程。每次学习一个新的框架/插件的时候,我们一开始都是按照官方示例写代码,达到了会用的目的。等用一段时候之后,就应该学习源码,学习它是如何设计的,为啥,简简单单的一个配置就可以完成很多事情。示例代码来自插件自带的springBoot整合示例代码: //简单的依赖,一个starter,一个h2内存数据库 <dep...
2020-01-07 10:53:47
747
原创 MyBatis源码的学习(21)---mybatis中当参数只有一个且是自定义对象类型时提示reflection.ReflectionException: There is no getter
Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'user' in 'class learn.User'### Cause: org.apache.ibatis.reflection.Reflectio...
2020-01-06 20:36:56
465
原创 SpringBoot整合mybatis-plus的使用---提示未绑定默认接口中的抽象方法的解决和源码分析
示例代码,仿照官网写的。在自己写的demo中,遇到一个问题:提示方法绑定不了org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.itw.zhangzx.mybatisPlus.mapper.UserMapper.selectList解决方法:在我们继承的Base...
2020-01-05 21:04:05
1022
原创 SpringBoot源码阅读---整合mybatis
依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</versi...
2020-01-05 16:48:10
298
原创 MyBatis源码的学习(20)---如何从jdbc到mybatis?
mybatis源码解读,基本简单的流程已经解析的差不多了,这里做个总结:从架构的角度,分析下如何把jdbc封装成myBatis的。原生的jdbc代码步骤:1.获取连接(连接信息等可以从配置文件中获取)2.sql3.创建statement对象4.设置参数5.执行statement6.结果集映射为java类型7.释放资源从架构的角度看问题:首先,连接信息需要的驱...
2020-01-04 20:42:35
207
原创 SpringBoot源码阅读--自定义Starter
新建一个maven项目,引入相关依赖。然后在META-INF文件夹下新建文件 spring.factories。配置我们的自动配置类<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or...
2020-01-04 20:24:21
157
原创 MyBatis源码的学习(19)---如何将jdbc的返回结果resultSet处理为我们想要的java类型
处理结果集的逻辑:ResultSetHandler---->TypeHandler @Override public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boun...
2020-01-04 14:40:03
1096
原创 git使用的常用命令
从远程仓库下载代码到本地:git clone git@github.com:itwzhangzx02/mybatis-3.gitgit fetch git@github.com:itwzhangzx02/mybatis-3.gitpull = fetch+merge (会多一个合并的记录出来)pull = fetch+rebase(不会多一个合并的记录出来)本地做了...
2020-01-02 09:16:22
143
原创 SpringBoot源码阅读--配置文件详解
下面是官网的配置的优先级:(数字越小的,优先级越高)Spring Boot设计了一个非常特别的PropertySource顺序,以允许对属性值进行合理的覆盖,属性会以如下的顺序进行设值:home目录下的devtools全局设置属性(~/.spring-boot-devtools.properties,如果devtools激活)。 测试用例上的@TestPropertySource注解。...
2019-12-31 15:40:42
291
原创 MyBatis源码的学习(18)---如何对statement对象进行参数赋值操作的?
前面说过,我们建立连接,创建statement对象,接下来我们看看如何进行赋值操作private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { Statement stmt; Connection connection = getConn...
2019-12-31 10:48:21
891
原创 MyBatis源码的学习(17)---如何使用JDK动态代理进行日志记录的织入
在学习Spring的时候,我们经常说到AOP。然后举例的时候,经常会说,比如日志切面的切入,将日志功能织入到主体功能中,进行日志记录。今天,我们看一下MyBatis中使用动态代理织入记录日志的功能。// SimpleExecutor类 @Override public <E> List<E> doQuery(MappedStatement ms, Object ...
2019-12-31 10:29:52
263
原创 MyBatis源码的学习(16)---拦截器为何不能拦截Executor中6个参数的query方法
今天,配置了一个MyBatis拦截器如下:package learn.interceptors;import org.apache.ibatis.cache.CacheKey;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.BoundSql;import org.apache.i...
2019-12-30 15:41:42
2497
1
原创 MyBatis源码的学习(15)---sqlSession.selectList方法
sqlSession一共俩个实现类,我们这里分析默认的DefaultSqlSession类public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { try { //ms对象代表我们的xml中的一条sql。例如:<select...
2019-12-29 22:18:09
7224
1
原创 MyBatis源码的学习(14)---SqlSource和SqlNode
sqlSource接口中最底层的,最基础的是: StaticSqlSource,里面sql字段用于存放解析好的sql,比如将'#{}'替换为“?”占位符BoundSql getBoundSql(Object parameterObject);RawSqlSource--.>StaticSqlSource-- >sql常规的解析Mapper.xml的时候,我们创建S...
2019-12-29 10:38:04
713
原创 jvm的性能调优
常规的参数设置:-Xms2048m -Xmx2048m -Xmm700m按照jvm规范,一般年轻代:老年代是 1:2年轻代中s:e为1:8.尽量将堆大小设置为固定值,不要使用浮动扩容。比如:-Xms2048m -Xmx4096m还有就是,堆大小不是越大越好,如果堆内存太大,到时候一次full gc可能需要好久才触发一次,这样每次full gc时将会造成很大的停顿时间。...
2019-12-27 23:26:13
336
原创 MyBatis源码的学习(13)---Mybatis是如何构建sql的?
统一的一个接口:sqlSource俩个实现类:1.RawSqlSource 解析:select * from user where name = #{name}属性字段 sqlSource --StaticSqlSource类型的StaticSqlSource进行将'#{}'替换为 ?占位符StaticSqlSource中的属性字段sql用于存储解析后的sql select ...
2019-12-27 21:50:40
412
原创 MyBatis源码的学习(12)---Mybatis是如何从Mapper.xml中的select到sqlSession.selectList的?
这个问题:估计大家都知道是动态代理。可是除了动态代理这之间还有哪些设计模式呢? //3、获取mapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //4、执行数据库操作,并处理结果集 return userMapper.selectUser("10");先看我们的getM...
2019-12-26 22:54:19
621
原创 SpringBoot源码阅读--编写我们的HelloWorld
新建一个 module在我们的项目根目录下:一直下一步就可以了。建好的module后,修改pom文件:(这个可以参考官网,我这按官网操作的)<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://w...
2019-12-23 22:42:18
130
原创 SpringBoot源码阅读--环境搭建
先在github上找到springBoot的仓库,如果直接clone或者先fork到自己的github,再执行clone都会失败。最后,折中的方法,直接下载源码包.zip文件,然后导入本地。直接到releases中找一个版本的,然后下载.zip文件。然后解压到你的任意位置。再用idea打开pom文件前,先记得将镜像地址配好了,配成阿里云的。配置你要使用的maven的配置文件,添加镜...
2019-12-23 16:26:11
530
原创 JAVA并发编程--ForkJoin的使用
思想:拆分归并1.任务拆分 fork()2.结果归并 join()package learn.ForkJoin;import java.util.concurrent.ForkJoinPool;public class ForkJoinTest { public static void main(String[] args) { test(); } ...
2019-12-22 16:30:27
171
原创 单例模式singleton--你真的会用吗?
作为23中设计模式中最简单的一种模式,网传有8中写法。我想说的是:会的多不如学的精,今天看了一个公众号推送的文章,上面直接说双重检查机制的单例是线程安全的。首先,从大类上分:饿汉和懒汉。就是要不要延迟实例化的问题?如果,你项目中的有配置类,构造类等,反正你迟早要用到,为了不出错,直接饿汉式就好了。写代码首先是安全,其次是性能,千万别学了点花把式就看不起基础的拳脚。package le...
2019-12-21 16:14:59
91
原创 MyBatis源码的学习(11)---Mybatis二级缓存默认LRU算法的分析
首先说结论,百度Mybatis的lru算法时,都说的是,活跃的节点放到了头部,如果容量满了,会先剔除掉尾节点。这个说法是不对的,在MyBatis中的lruCache中,不活跃的节点是头节点,这个节点会被剔除掉,每次我们的get和put操作时,会把活跃的节点放到尾部。为了方便研究问题,我们先修改源码,将LruCache的容量改小点:size改为5.public class LruCache...
2019-12-21 13:00:36
605
原创 Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?
先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。package com.br.itwzhangzx02.learn;import org.junit.Test;import java.util.ArrayList;import java.util.List;import com.br.itwzhangzx02...
2019-12-21 10:29:24
9111
1
原创 MyBatis源码的学习(8)---Executor执行器的的创建
/*** 来自DefaultSqlSessionFactory类。*/@Override public SqlSession openSession(boolean autoCommit) { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit...
2019-12-19 19:12:26
170
原创 MyBatis源码的学习(10)---高版本的Mapper.XML中为何不能使用#{0},#{1}操作?
public void updateName(@Param("name") String name , @Param("id")String id);XML中获取参数: <update id="updateName" parameterType="String" > update u_user set username = #{name} where userco...
2019-12-18 20:08:01
824
原创 MyBatis源码的学习(9)---映射器mappers的的XML解析
来自官方文档解析的方式如下:<!-- 使用相对于类路径的资源引用 --><mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <...
2019-12-18 09:23:47
204
原创 Maven打包时,跳过单元测试
今天,打包的时候,由于运行测试用例导致打包失败。后来查资料后,已解决,这里记录下。黑体部分,跳过测试环节<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <con...
2019-12-17 21:31:52
177
原创 MyBatis源码的学习(7)---MappedStatement的的创建
SqlSessionFactoryBuilder--->XMLConfigBuilder---> XMLMapperBuilder---(桥梁)MapperBuilderAssistant--->XMLStatementBuilder(parseStatementNode方法)--(桥梁)MapperBuilderAssistant(addMappedStatemen...
2019-12-16 12:06:08
543
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人