自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring框架编译报could not resolve plugin artifact io.spring.dependency-management

spring框架编译的时候,报Plugin Repositories (could not resolve plugin artifact ‘io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.0.5.RELEASE’)解决办法:打开配置文件gradle-wrapper.properties将distributionUrl修改旧:distributionUrl=https://services

2020-10-13 10:43:35 3974 1

原创 注解配置整合springmvc源码笔记

启动tomcat后,tomcat会去扫描MATA-INF-》services文件夹下的配置文件这个类继承了ServletContainerInitializer接口,tomcat会去调用onStartUp方法。这个方法主要的作用是递归文件夹,并赛选出继承WebApplicationInitializer接口的类筛选完成之后调用他们的onStartUp方法。我自己写了一个类,继承了AbstractAnnotationConfigDispatcherServletInitializer,onSt

2020-10-08 23:12:07 107

原创 Spring事务的传播和开启

若要开启Spring的事务功能,可以使用Annotation注解的方式开启,@EnableTransactionManagement(proxyTargetClass = false),这个注解会自动导入TransactionManagementConfigurationSelector类然后TransactionManagementConfigurationSelector会去通过查看父类,可知会在TransactionManagementConfiguration中调用在调用invoke

2020-10-03 22:57:54 204

原创 spring的aop入口

Spring的aop触发是在bdf实例化完成后触发。方法的入口在这里得先冲aop的入口类跟先去找该类的切面首先拿到所有切面通过这个canApply方法来匹配当前类的切面eligibleAdvisors当前类的切面,candidateAdvisors是所有切面。这里是给切面排序然后记录该类有没有被切面拦截然后开始生成代理...

2020-09-24 23:42:24 545 1

原创 spring源码导入报DefaultKotlinSourceSetK和plugin is not in

导入spring源码的时候报了两个错误错误1 Gradle Core Plugins (plugin is not in ‘org.gradle’ namespace)修改gradle-wrapper.properties的配置,将gradle的版本与自己本地安装的版本一致。错误2 org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetKt的错误排查了很久发现其原因是build.gradle配置的kotlin版本与自己本地

2020-08-01 19:27:00 920 1

原创 使用工具Mysqldumpslow和pt_query_digest查看MySql慢查询日志

配置了慢查询后,它会记录符合条件的 SQL 包括:1.查询语句2.数据修改语句3.已经回滚得 SQL查看慢查询日志是否开启show VARIABLES like '%slow_query_log%'查看慢查询文件的存放位置show VARIABLES like '%slow_query_log%'查看记录慢查询语句的阈值默认为10sshow VARIABLES like '%long_query_time%'查看是否记录没有使用索引的sql语句show VARIABLES lik

2020-06-30 23:56:37 293

原创 MySql锁等待问题的处理办法

建表CREATE TABLE testdemo ( `id` int(255) NOT NULL , `c1` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `c2` int(50) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX `idx_c2` (`c2`) USING BTREE )ENGINE=InnoDB;insert into testdem

2020-06-30 23:20:09 404

原创 Ferderated引擎使用

Ferderated特点1.提供了访问远程 MySQL 服务器上表的方法。2.本地不存储数据,数据全存储在远程服务器上。3.本地要保存表结构和远程连接的信息。使用场景的统计分析及手工查询(某些游戏行业)开启Ferderated默认是关闭的,需要在mysql配置中添加配置[root@localhost mall]# vi /etc/my.cnf跨数据库查询# 创建一个本地库create database local;#创建一个远程库create database remote;

2020-06-30 22:47:19 241 1

原创 MySql_Utilities安装与并查看frm格式文件

安装tar -zxvf mysql-utilities-1.6.5.tar.gzcd mysql-utilities-1.6.5python ./setup.py buildpython ./setup.py install连接MySQL服务器使用mysql_config_editor工具添加如下连接信息:[root@localhost mysql-utilities-1.6.5]# mysql_config_editor set --login-path=instance_3306 --h

2020-06-28 19:35:05 1258

原创 CentOS开机启动时执行Shell脚本文件启动MySql多实例服务

编辑my.cnf,将用户名和密码录入到文件中[mysqld_multi]mysqld = /usr/local/mysql/bin/mysqld_safemysqladmin =/usr/local/mysql/bin/mysqladminlog =/usr/local/mysql/mysqld_multi.loguser=rootpass=root1234%[mysqld1]socket = /tmp/mysql1.sockport = 3307pid-file = /usr/loc

2020-06-28 18:31:34 407

原创 CentOS7安装MySql多实例

安装之前的环境在安装多实例之前首先先在虚拟机中的服务器里边先安装好一个MySql,端口为3306开始安装一个新实例1.在local目录下,创建一个data3文件夹,cd /usr/localmkdir data3请忽略我的data1和data2到etc修改my.cnf文件,如果没有就创建,vi my.cnf将下面的文本粘贴上去[root@localhost etc]# vi my.cnf[mysqld_multi]mysqld = /usr/local/mysql/bin

2020-06-26 15:35:08 438

原创 MySql权限分配

MySql权限所涉及的表mysql.user,mysql.db,mysql.table_priv,mysql_column_priv最简单的权限grant SELECT on mall.* TO ‘dev’@‘192.168.159.%’ IDENTIFIED BY ‘123’ WITH GRANT OPTION;创建一个dev用户,密码为123,只能在运行在网段为192.168.159.*的网段做查询操作。在执行show grants for ‘dev’@‘192.168.159.%’结果:

2020-06-26 00:20:15 229

原创 CentOS虚拟机上不网报Name or service not known解决办法

之前虚拟机一直上不了网,虽然service network restart没有报错,物理机可以ping通虚拟机,但是虚拟机ping不通互联网如,ping www.baidu.com时,会报Name or service not known,之前一直以为是NAT没有配好,但是检查了很久NAT应该没有问题,之后谷歌搜了一位大神的解决办法,之后就搞掂了,具体步骤如下1.Remove the broken symlink:rm /etc/resolv.conf2.Create an /etc/Network

2020-06-23 14:50:50 2945 1

原创 JVM调优和深入理解性能优化

JVM调优的本质JVM调优主要调的是稳定,如果系统出现频繁的垃圾回收,这个时候系统是不稳定的,所以需要我们来进行JVM调优,调整垃圾回收的频次。GC调优原则1.大多数的java应用不需要GC优化。2.大部需要GC调优的不是参数问题,而是代码问题。3.分析GC情况优化代码比优化GC擦书多得多。4.GC调优是最后手段。观察需要调优的条件MinorGC执行时间不到50msMinorGC执行不频繁,约10s一次FullGC执行时间不到1sFullGC执行频率不算频繁,大于10分钟1次GC 调

2020-06-21 23:54:46 347

原创 idea启动tomcat乱码问题终极解决方案

https://blog.csdn.net/liu865033503/article/details/81094575如果以上文章试过了还是不行就这么干Tomcat conf 下面logging.properties这个文件UTF-8改成GBK

2020-06-21 11:10:07 137

原创 JVM执行子程序

Class文件结构Class文件类每个 Class 文件的头 4 个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的 Class 文件。后四位代表JDK的版本。版本推算:1.34(16进制)=56(十进制)2.java的版本号从45开始,56-45=73.jdk1.1+0.7=jdk1.8所以可推算class文件适运行在jdk1.8版本中。虚拟机栈运行时的栈桢结构局部变量表操作数栈动态连接方法返回地址重叠区域,同一个方法调用方法时

2020-06-16 18:45:29 138

原创 JVM垃圾回收算法与垃圾回收器

谁要GC?栈(线程)—不需要GC堆(对象)——需要GC方法区(存放字节码常量)——需要GCGC如何判断对象的存活?1.使用引用技术算法。2.可达性分析。引用计数算法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。优点:快,方便,实现简单。缺点::对象相互引用时(A.instance=B 同时 B.instance=A),产生循环引用,很难判断对象是否该回收。可达性分析判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对

2020-06-15 20:46:03 106

原创 JVM中的对象

在java虚拟机中new指令时,对象的分配过程如下:检查加载-》分配内存-》内存空间初始化-》设置-》对象初始化。检查加载先执行相应的类加载过程,如果没有,则进行类加载。分配内存根据方法区的信息确定为该类分配内存空间大小。内存分配方式可分为“指针碰撞”和“空闲列表”两种方式。指针碰撞:java 堆内存空间规整的情况下使用。空闲列表:java堆空间不规整的情况下使用。如下图:具体使用哪种方式分配内存与使用的GC机制有关。在多线程环境下创建对象,虚拟机如何保证线程安全?在多线程环境下,

2020-06-14 20:38:32 86

原创 java字节码文件解读

有一个简单的main方法public class ConstantPool { public static void main(String[] args) { String b = "卧虎"; String a = b + "藏龙"; System.out.println(a.intern() == a); }}使用javac指定编译,将生成字节码文件ConstantPool.classjavac ConstantPool.jav

2020-06-13 23:04:51 124

原创 JVM内存区域

虚拟机的发展Hotspot VM是当今使用最广泛Java虚拟机。程序计数器的作用记录线程的执行进度,确保多线程程序正常执行。为什么JVM使用栈因为使用栈可以兼容方法调用方法的特点。JVM运行时序图局部变量表:存放我们的局部变量的。主要存放Java的八大基础数据类型,如果是Object对象,我们只需要存放引用类型地址。操作数栈:存放方法执行的操作数。动态链接:Java语言特定多态,需要类加载、运行时才能确定具体的方法。返回地址:调用程序计数器中的地址为返回。本地方法栈:各虚拟机自由实现

2020-06-13 00:47:04 118

原创 ConcurrentHashMap1.8学习笔记

ConcurrentHashMap1.8和1.7相比之下做了一些改进,其改进如下::改进1:取消的segments字段,使用Entry<K,V>保存数据,并大量的使用了CAS+synchronized来保证并发安全性。改进2:将原先的table数组+单向链表变更为table+单链表+红黑树。因为用户如果链表运气不佳,还是会存在一些队列长度过长的情况,如果还使用单项列表的查找方式,那么查询时间复杂度将退化为O(N),因此对于个数超过8的列表,jdk1.8会将其转换为红黑树结构,查询速度就可降低

2020-05-20 00:05:36 193

原创 ConcurrentHashMap源码实现分析

为什么要使用ConcurrentHashMap在多线程环境下,使用HashMap进行put操作,会引起死循环,导致CPU利用率接近100%。HashMap在并发执行put操作时会形成一种环形链表,一旦形成环形数据结构,Entry的nex节点不会为空,当查找一个链表中不存在的数据时,会引起死循环。原因在多并发情况家,一个线程先期完成了扩容,将原来的列表散列到自己的表中,形成了一个倒序,而另一个线程进行扩容时,将已倒序的表又散列成为正序,这样会产生一个环形,当get一个不存在的节点时,会产生一个死循环。所

2020-05-15 23:20:34 215

原创 Semaphore并发工具类解析

Semaphore是java并发工具类之一,他继承于AQS类,所以它的底层框架是AQS。他主要用于协调各个线程,以保证合理的使用公共资源,它的应用场景主要用于流控,例如数据库连接池。下面我们看看Semaphore源码,它是如何实现流控的。Semaphore初始化默认使用的是非公平锁机制,看方法名便可知。初始化许可证数量: Sync(int permits) { setState(permits); }获取锁尝试获取许可证,并返回剩下的数量: prote

2020-05-12 23:12:23 143

原创 ThreadLocal 辨析

ThreadLocal 和 Synchonized 都用于解决多线程并发訪问。可是 ThreadLocal与 synchronized 有本质的差别。synchronized 是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程訪问。而 ThreadLocal 为每个线程都提供了变量的副本,使得每个线程在某一时间訪问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。*ThreadLo...

2020-05-04 23:19:32 89

原创 volatile最轻量的同步机制

volatile 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。public class VolatileCase { private volatile static boolean ready; private static int number; // private static class P...

2020-05-04 18:31:21 220

原创 java线程的中止

中止线程有三种方式分别是,自然中断、stop、中断。他们区别分别为:线程自然终止:要么是 run 执行完成了,要么是抛出了一个未处理的异常导致线程提前结束。stop:暂停、恢复和停止操作对应在线程 Thread 的 API 就是 suspend()、resume()和 stop()。但是这些 API 是过期的,也就是不建议使用的。不建议使用的原因主要有:以 suspend()方法为例,在调用后...

2020-05-03 17:41:40 127

原创 并行和并发

我们举个例子,如果有条高速公路 A 上面并排有 8 条车道,那么最大的并行车辆就是 8 辆此条高速公路 A 同时并排行走的车辆小于等于 8 辆的时候,车辆就可以并行运行。CPU 也是这个原理,一个 CPU 相当于一个高速公路 A,核心数或者线程数就相当于并排可以通行的车道;而多个 CPU 就相当于并排有多条高速公路,而每个高速公路并排有多个车道。当谈论并发的时候一定要加个单位时间,也就是说单位时...

2020-05-03 16:48:09 274

原创 进程与线程的区别

什么是进程和线程进程是程序运行资源分配的最小单位。进程是操作系统分配的最小的单位,包括磁盘IO,cpu、内存空间等。同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的。线程是cpu调度的最小单位,必须依赖于进程线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的、能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资...

2020-05-03 16:21:43 168

原创 Mybatis数据源技术解析

数据源的创建数据源是一个比较复杂的对象,其创建过程复杂,对于Mybatis创建一个数据源,具体来讲有如下难点:1.常见的数据源件组都实现了javax.sql.DataSource接口2.Mybatis不但要能集成第三方组件,自身也得提供数据源的实现。3.一般情况数据源初始化的参数较多,比较复杂。...

2020-04-28 19:56:53 166

原创 简单工厂模式与工厂模式的区别

数据源的创建比较复杂,对于复杂对象的创建,可以考虑使用简单工厂模式和工厂模式。下面介绍简单工厂模式和工厂模式。简单工厂模式简单工厂模式及时专门使用一个类来创建其他类的实例,被创建的额实例通常都有共同的父类。使用步骤步骤1. 创建抽象产品类,定义具体产品的公共接口abstract class Product{ public abstract void Show();}步骤2....

2020-04-28 00:08:03 1371

原创 Mybatis日志模块之日志打印的实现原理

在日志模块中有BaseJdbcLogger、ConnectionLogger、PreparedStatementLogger、ResultSetLogger、StatementLogger通过动态代理的方式打印在不同的位置打印日志。几个相关的类图如下:BaseJdbcLogger是所有日志的增强类,用于记录jdbc那些方法需要增强,保存运行期间的sql参数信息。ConnectionLogg...

2020-04-25 23:47:47 970

原创 Mybatis日志模块之日志组件优先加载原理

在java.lang.reflect.Constructor.LogFactory类的静态代码块中,通过静态代码块确保第三方日志插件加载优先级如下:slf4J → commonsLoging → Log4J2 → Log4J → JdkLog;public final class LogFactory { /** * Marker to be used by logging impl...

2020-04-25 20:03:06 174

原创 Mybatis日志模块之适配器模式

mybatis没有提供日志的实现类,需要使用第三方日志组件,市面上优秀的日志插件很多,而且日志级别各不相同,为了接入不同的日志组件,mybatis使用了适配器模式。mybatis一共有四个日志级别,分别是trace、warn、dubug、erro。下面对日志模块的封装原理及原理进行分析,日志模块类图如下:...

2020-04-25 19:20:48 168

原创 AOP代理模式理解JDK动态代理实现原理

jdk的动态代理类是通过继承InvocationHandler接口,实现invoke方法。通过Proxy类的newProxyInstance方法,来创建一个字节码文件,此文件相当于一个被增强的新类,并存在jdk的内存中。当调用接口方法时,会调取代理类的invoke方法来完成对被代理类来实现,而invoke方法会根据传入的对象和方法名称还有参数,调取代理类的相应方法。下面使用jdk的源码进行深入理...

2020-04-23 23:43:32 143

原创 AOP代理模式理解及使用

代理模式的定义定义:给目标对象提供一个代理对象,并控制对目标对象的引用。目的:1.通过代理对象,对原有的对象进行增强。2.通过引入代理对象的方式访问目标对象,简化目标对象给系统带来的复杂性。1)简单代理模式类图public interface InsertOp { void insertLog(String params);}public class InserOpImp ...

2020-04-23 16:05:07 439

原创 Mybatis学习之路-简单配置及使用

类别说明SqlSessionFactoryBuilder读物配置信息创建SqlSessionFactory,建造者模式,方法级别。SqlSessionFactory创建SqlSession,工厂单例模式,存在于程序的整个生命周期。SqlSession代表依次数据库连接,可以直接调用Sql语句,也可以通过调用Mapper访问数据库。但是线程不安全,要保证线程独享...

2020-04-18 23:41:53 89

原创 Mybatis学习之路--使用JDBC实现与数据库的操作

在项目中虽然很少会直接使用jdbc进行数据库操作,但是jdbc是java代码访问数据库的基础,比如mybatis的底层使用的是jdbc写的,所以了解java代码是如何使用jdbc访问数据库还是很重要的。1.使用jdbc做查询@Testpublic void queryPrepareStatementTest() { Connection conn = null; P...

2020-04-15 23:57:34 496

原创 (二)Mysql调优小技巧-解析执行计划

执行计划就是使用explain关键字,来模拟执行的sql语句,从而知道mysql是如何处理sql的,分析查询语句或是表结构的性能瓶颈。执行计划的语法:EXPLAINselect* fromtb;执行计划的详解:下面开始分别对id列:描述select查询的序列号,表示select执行语句或者操作表的顺序。id列相同的情况:id不同的情况从以上结果得出...

2020-04-12 20:15:56 117

原创 mysql三大范式和反范式设计的理解

第一大范式:数据库表中的所有字段都只具有单一属性。id name-age 1 李雷-19 2 韩梅梅-18 表中name-age字段合为一列,违反了第一范式,应该拆分为两列id name age 1 李雷 19 2 韩梅梅 18 第二大范式:要求表中只具有一个业务主键。也就是说不能存在非主键列,只对部分主键依赖...

2020-04-11 23:55:59 182

原创 (一)Mysql优化小技巧-开启并使用工具查看慢查询日志

Mysql优化问题首先需要先开启慢查询监控的功能。1.使用语句showvariableslike'slow_query%'查询慢查询监控是否开启。得到的结果为:slow_query_logOFFslow_query_log_fileE:\software\mysql-8.0.18-winx64\data\DESKTOP-79UV3JR-slow.log2....

2020-04-11 23:15:38 169

空空如也

空空如也

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

TA关注的人

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