自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redis持久化方案介绍

Redis有两种持久化方案:1. RDB持久化 2. AOF持久化。

2022-12-15 22:48:32 455 1

原创 从Spring Cloud Gateway过滤器中获取请求体的最优方案

这个全局过滤器的目的就是把原有的request请求中的body内容读出来(原有的body都是以流的形式被传递),并且使用ServerHttpRequestDecorator这个请求装饰器对request进行包装,重写getBody方法,并把包装后的请求放到过滤器链中传递下去。可以满足多次获取请求。出现这个问题的时候我们第一反应应该很简单,但是真正实现的时候却有点困难。下面我就把我的方便理解的解决方案写下来。经过多方面的查看资料得出以上两个步骤就能完美的解决gateway过滤器中获取请求体的方案。

2022-12-15 21:51:38 2401

原创 SpringBoot项目启动执行任务的几种方式

看到打印的信息后我们可以发现他们的执行顺序,filter是在最前面的。这几种方法经常会被用到,当我们的项目启动后需要调用对应的方法,用来项目的初始化等。init() :该方法在tomcat容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。可以在这个方法中补充想要执行的内容。7.直接在启动类下面调用方法。

2022-10-31 22:21:50 9645 1

原创 Spring拦截器和过滤器的区别及详解

拦截器它是链式调用,一个应用中可以同时存在多个拦截器Interceptor,一个请求也可以触发多个拦截器,而每个拦截器的调用会依据它的声明顺序依次执行。拦截器和filter的功能都是拦截,filter是在servlet前执行的,拦截器拦截的是Spring MVC定义的概念。--HandlerInterceptor是springMVC中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。--MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,常用AOP。

2022-10-31 21:20:39 3564

原创 mysql和postgresql锁机制对比

mysql数据库表锁行锁的理解_傻鱼爱编程的博客-CSDN博客postgresql是完全开源的,且大多数公司都在使用这个数据库。postgresql中表锁和行锁比mysql分类要细很多。1.访问共享锁(ACCESS SHARE) 使用SELECT命令可在查询的表上获得该锁。一般规则是所有的查询中只有读表才获取此锁。2.行共享锁(ROW SHARE) 使用SELECT FOR UPDATE和SELECT FOR SHARE命令可在当前表上获得该锁。

2022-10-23 18:41:19 829

原创 乐观锁(CAS)和悲观锁(synchronized)的详细介绍

在代码中多个线程需要同时操作共享变量,这时需要给变量上把锁,保证变量值是线程安全的。锁的种类非常多,比如:互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等这些概念,总结下来就两种类型,乐观锁和悲观锁。CAS 即 Compare and Swap,它体现的一种乐观锁的思想,比如:多个线程要对一个共享的整型变量执行 +1 操作:// 需要不断尝试int 旧值 = 共享变量;// 比如拿到了当前值 0int 结果 = 旧值 + 1;// 在旧值 0 的基础上增加 1 ,正确结果是 1。

2022-10-21 23:17:26 8591 1

原创 Java中类的初始化及类加载器的介绍

要加载一个类.class,从低层级到高层级一级一级委派,先由应用层加载器委派给扩展类加载器,再由扩展类委派给启动类加载器;启动类加载器无法加载,再由扩展类加载器载入,扩展类加载器无法加载,最后由应用类加载器载入,如果应用类加载器也找不到,就会触发findclass,抛出classNotFoundException。1.通过委派的方式,可以避免类的重复加载,父加载器已经加载过某一个类时,子加载器就不会再重新加载这个类。Java类的初始化--虚拟机会保证这个类的 构造方法 线程安全,类其实就是懒加载。

2022-10-18 23:30:48 318

原创 java的内存模型(可见性,原子性,有序性)详细介绍

Java内存模型(JMM,Java Memory Model),控制 Java 线程之间的共享数据的通信。是Java 定义的并发编程相关的一组规范,除了抽象了线程和主内存之间的关系之外,其还规定了从 Java 源代码到 CPU 可执行指令的这个转化过程要遵守哪些和并发相关的原则和规范,其主要目的是为了简化多线程编程。

2022-10-18 23:30:22 782

原创 java内存模型(线程内存和主内存)详细介绍

Java内存模型(JMM)抽象了线程和主内存之间的关系,比如:线程之间的共享变量必须存储在主内存中。Java内存模型下,线程可以把变量保存到本地内存中,而不是直接在主内存中进行读写。这就可能造成一个线程在主内存中修改了一个变量的值,而另外一个线程还继续使用它在本地内存中的变量值的拷贝,造成数据的不一致。这和CPU缓存(上篇文章缓存一致性)模型非常相似。

2022-10-18 23:29:54 1819

原创 Spring Cloud之Nacos注册中心及配置中心

系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,分散中还包含着冗余。对于在微服务时代,会有大量的重复实例,所以配置中心就诞生了。配置中心解决了在分布式场景下多环境配置文件的管理和维护。

2022-09-06 23:45:03 1143

原创 Spring Cloud的Feign和ribbon和Hystrix超时时间设置及关系

我们用到spring Cloud的时候,Feign和Ribbon和Hystrix都是必不可少的配置项。下面就来详细说下他们三者的关系及如何配置。本次演示采用:spring-cloud-starter-openfeign:2.1.0RELEASE版本。

2022-09-04 16:57:14 2221 1

原创 Mysql数据库日志的用法解读

每种数据库都会有日志的存在,可以查看数据库的使用情况,执行数据库sql情况等。mysql也不例外。在 MySQL 中有这 4 种不同的日志,这些日志记录着数据库在不同方面的踪迹。

2022-08-28 22:55:36 585

原创 数据库优化方法及思路分析

我们平时开发时,数据库是必不可少的组件。如果是数据量大的应用,我们势必要进行数据库的优化。下面我来分析应该从哪些方面入手(如果有更好的建议,请留言)。

2022-08-27 23:00:30 584

原创 mysql数据库优化之数据库非sql优化

五在实际生产环境中,我们sql优化已经完成,由于数据库本身的性能局限,就必须要对数据库的应用进行一些优化,来降低数据库的访问压力。1. 减少对数据库的访问次数1.1 增加cache层缓存,使用数据库的一级缓存/二级缓存,或者使用redis数据库来缓存数据。1.2 获取需要不同的字段信息,能用一条sql就合并成一条sql;比如: select id , name from student;合并后:select id, name , age from student;...

2022-08-27 22:57:58 332

原创 mysql数据库表锁行锁的理解

锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。在数据库中,如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。行锁特点 :开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。InnoDB实现了以下两种类型的行锁。共享锁:又称为读锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。...

2022-08-27 22:54:58 431

原创 mysql结构解读及介绍

第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询的顺序,是否利用索引等, 最后生成相应的执行操作。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。数据存储层, 主要是将数据存储在文件系统之上,并完成与存储引擎的交互,存储的还有相关的日志信息。

2022-08-22 22:08:33 183

原创 Netty--NIO的基本介绍(NIO组件,ByteBuffer基本使用,FileChannel的用法)

常见的 Channel:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel。需要复制大文件时,这个方法超级好用(底层限制,一次性最大复制2G,大于2G需要循环使用)组件2:Buffer用来缓冲读写数据,常见的 buffer 有ByteBuffer。FileChannel可以使用文本输入输出流创建,也可以用随机流创建。NIO从字面上理解:non-blocking io 非阻塞 IO。组件1:Channel是读写数据的。......

2022-08-14 20:41:22 266

原创 Java操作文件Path 和 Paths 及Files类介绍

2.4. 复制文件:Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);2.5. 移动文件:Files.move(from, to, StandardCopyOption.ATOMIC_MOVE);创建文件,删除文件,复制文件,查找文件,查找文件个数等,只需要调一个Api就能解决,下面开始进行介绍。这是一套非常好用操作文件的方法,省去了以前复杂的文件操作方法。...

2022-08-14 17:50:30 2680

原创 java 实现事件监听EventListener的方式详解及分析

我们开发中经常遇到监听事件,首先我们先来了解下事件相关知识:使用场景(场景一):银行操作转账成功后需要给客户发送短信和邮件,使用事件就可以实现解耦并异步。我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事件。事件驱动机制是观察者模式(称发布订阅)具体实现,事件对象(Event)相当于被观察对象(Subject), 事件监听(EventListener) 相当于观察者(Observer)......

2022-08-08 23:35:22 10233

原创 MYSQL报错-CannotCreateTransactionException: Could not open JDBC Connection for transaction 问题分析及解决方案

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-3 - Connection is not available, request timed out after 30001ms.

2022-08-06 23:29:48 11689

原创 SpringBoot定时任务实现方式--超好用

同一个服务开启多个任务时,任务的执行时机受上一个任务执行时间的影响。适用于只有一个定时任务的项目,多个定时器会影响定时任务的时效问题。请看下一个开启定时任务的方法--多线程开启任务。//参数1定时任务,参数2项目启动后延时运行时间,参数3执行任务的频率。默认就会开启多线程。2.当项目只有一个定时任务时可以使用第一或者第二种方式创建定时任务,因为写法简单,方便快捷。这种方式是多线程开启定时任务,一个项目中可以配备多个定时任务,不会相互影响。创建定时任务,因为这样定时任务线程不同,不会相互影响。......

2022-07-31 23:23:28 675 1

原创 线程池需要关闭吗?使用线程池出现内存泄露的详细分析

最近项我们创建线程池的目的就是反复利用线程池里的线程,如果频繁创建和关闭线程池,解决了内存泄露的问题。线程数量不断上升,导致的内存泄露。总结我们使用线程池就是为了反复利用线程的,所以在真正的项目中不会出现手动关闭线程池的操作。要尽量想其他的方案。我们发现是反复创建线程池导致的,难道我们要shutdown()关闭吗?答案是不能直接关闭。我们创建线程池的目的就是反复利用线程池里的线程,如果频繁创建和关闭线程池,解决了内存泄露的问题,但是失去了使用线程池的意义。......

2022-07-31 20:00:58 7966 3

原创 多线程保证单个线程开启事务并生效的方案

通过对源码的解读,TransactionTemplate封装的是PlatformTransactionManager。原因数据库连接spring是放在threadLocal里面,多线程场景下,拿到的数据库连接是不一样的,即是属于不同事务。Spring支持编程式事务和声明式事务,Spring提供的最原始的事务管理方式是基于TransactionDefinition、PlatformTransactionManager、TransactionStatus编程式事务。...

2022-07-25 22:16:41 3115 1

原创 线程池方式开启线程--submit()和execute()的区别

没有引用线程池的时候,需要我们通过继承Thread类和实现Runnable、Callable接口,最终调用start()方法启动线程。现在我们可以通过线程池的execute()和submit()方法来提交线程任务。

2022-07-24 21:45:10 1993

原创 多线程--线程和线程池的用法

进程和线程,创建线程的方式,继承 Thread 的方式(无返回值),实现Runnable接口(无返回值),实现Callable接口(有返回值),线程的生命周期,线程池,为什么要使用线程池,使用线程池的优势,线程池的应用场景,参数名参数含义核心线程数最大线程数空闲线程存活时间unit时间单位workQueue线程池任务队列创建线程的工厂handler拒绝策略。线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。线程池不仅能够保证内核的充分利用,还能防止过分调度。进程开始时创建一定数量的线程加到池中..

2022-07-23 23:05:29 1363 3

原创 springCloud组件Hystrix的用法

目录1.提供者降级1.1 在服务提供方,引入 hystrix 依赖1.2 定义降级方法1.3 使用 @HystrixCommand 注解配置降级方法1.4 在启动类上开启Hystrix功能:@EnableCircuitBreaker2.消费方降级2.1 feign 组件已经集成了 hystrix 组件, 不需要再次引坐标。2.2 定义feign 调用接口实现类,复写方法,即 降级方法2.3 在 @FeignClient 注解中使用 fallback 属性设置降级处理类。2.4 配置开启 feign.hyst

2022-07-12 23:15:10 350

原创 事务失效的情况和原因分析

我们就会想到@Transactional注解,但是添加这个注解后也可能也不会满足我们的需求,甚至事务不生效。下面我就分析下事务失效的原因及事务如何使用。下面开始介绍失效原因及解决方案。// @Service 必须要添加注解,被spring管理}}解决方案:添加@Service注解,使得事务类被spring管理。...

2022-06-20 23:47:32 4717

原创 spring响应数据再处理(spring统一处理)

在开发过程中有时候我们需要对响应的数据进行再封装,但是前面已经写了很多的响应信息,修改起来工作量巨大且可能会遗漏。这时候我们就可以使用返回值统一进行处理。比如直接封装到result中。我们可以使用@ControllerAdvice并实现ResponseBodyAdvice对每个接口的进行处理。我本次演示是自定义一个注解@Zhu,如果类或者方法上加上了这个注解就进行处理。当supports方法返回的是true的时候,才会执行beforeBodyWrite方法;可以进行返回值的判断,进行相应的处理。

2022-05-24 22:28:13 481

原创 Java中list转map的常用方法

我们开发中经常要用到list转map,下面我整理了几种方法供参考:先创建对象:package com.yabao.testvo;public class Student extends Man { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name;

2022-05-18 22:16:57 34972

原创 Java中spring请求参数预处理

使用注解@ControllerAdvice和注解@InitBinder对参数进行预处理,代码如下:/** * spring请求参数预处理的做法(对参数提前处理) */@ControllerAdvicepublic class MyRequestParamHandler { @InitBinder public void processParam(WebDataBinder dataBinder){ /* * 创建一个字符串微调编辑器(可以根.

2022-04-21 22:35:21 1025

原创 Java反射的用法

反射本质就是操作构造方法、成员变量、成员方法反射的基本理解:利用另一种方式去获取一个类的对象、调用类中的方法、使用类中的成员变量。反射是基于正射。 正射: 对象.方法(实际参数) 反射: 方法对象.invoke(对象,实际参数)反射代码的编写: 1、获取一个类的字节码对象 -> Class 类的类 字节码对象中封装了类中的构造方法、成员变量、成员方法 2、根据字节码对象获取类中相应的成员对象 ...

2022-03-25 15:19:10 3377

原创 注解@Autowired和@Resouce的区别

1.@Autowired默认按byType自动装配。而@Resource默认byName自动装配。2.@Autowired只有一个参数:required,表示是否开启自动准入,默认是true。@Resource包含七个参数,其中最重要的两个参数是:name 和 type。3.@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。...

2022-03-24 10:17:10 670

原创 java中关键字的整理

1、final关键字final关键字可以修饰类, 修饰成员变量,修饰方法, 修饰局部变量, 修饰方法的形参final修饰类, 表示最终类, 不能被继承final修饰成员变量, 在定义时必须初始化, 不能被修改, 一般与static同时使用称为final常量, 所有字母都大写final修饰方法, 不能被重写, 在子类中不能定义相同签名的方法final修饰局部变量, 一旦初始化就不能再修改, final修饰引用类型变量,是指这个引用不能再指向其他对象,可以修改它的属性值final修饰

2022-03-10 18:00:09 206

原创 java接口和抽象类的区别及在项目中的用法

抽象类:1、抽象类使用abstract修饰2、抽象类只能单继承3、含有抽象方法的类是抽象类,必须使用abstract关键字修饰4、抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法接口:1、接口使用interface修饰2、一个类可以实现多个接口3、接口中的方法均为抽象方法(特殊的抽象类)4、所有的属性肯定是 public、static和final,所有的方法都是abstract,所以可以默认不写上述标识符共同点:1、不能被实例化,即不能使用new关键字来实例化

2022-03-10 17:45:46 362

原创 Java中捕捉异常信息并处理的方法和分组后查询数据代码

捕捉异常信息并处理try { // 查询数据库语句 Student stu = StudentServiceImpl.deleteStudent("1");} catch (Exception e) { Throwable cause = e.getCause(); if(cause instanceof IOException) { String message = cause.getMessage(); if(null != mes

2022-01-24 21:58:47 947

原创 @Param注解的用法(dao层的用法)

实例一:使用@Param注解(xml里面需要studentBo.去拿值)dao层示例:PublicStudentselectStudent(@param(“studentBo”) StudentBo studentBo);xml映射对应示例:<selectid="selectStudent"resultMap="BaseResultMap">select*from use_student wherestudent_name=#{student...

2022-01-24 20:58:35 1131

原创 jvm垃圾回收和jvm调优介绍--Java之jvm

我从以下五个方向介绍:如何判断对象可以回收 垃圾回收算法 分代垃圾回收 垃圾回收器 垃圾回收调优1. 如何判断对象可以回1.1 引用计数法(Java没有采用这种算法)一个对象别引用一次,对象就会加一。直到为零时可以被回收。互相引用会导致无法回收(引用次数保持为1)1.2 可达性分析算法Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以 回收导出GC Roo

2022-01-23 21:06:23 586 2

原创 内存溢出和内存泄漏的区别及详解

jvm内存除了程序计数器不会发生内存溢出,其余的都可能存在内存溢出。1. 内存溢出(Out Of Memory)是程序在申请内存时,没有足够的内存空间供其使用。比如:你需要10M的空间,内存空间只剩8M,这就会出现内存溢出。以栈举例:栈满时在做进栈必定产生空间溢出,叫上溢,栈空时在做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.2. 内存泄漏 (Memory Leak)是程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后..

2022-01-23 20:32:16 9374

原创 static关键字-静态方法和静态变量

static关键信息:1.static关键字,可以修饰成员变量和成员方法2.static修饰的成员,可以通过对象名调用,也可以通过类名调用,推荐类名调用3.static修饰的成员变量也称为类变量,被该类的所有对象所共享,只有一份.4.类的静态成员随着类的加载而加载,优先于对象存在.5.静态方法只能访问静态成员变量和静态成员方法,静态方法中不能使用thisstatic修饰的方法没有线程安全问题,修饰的变量存在线程安全问题。...

2022-01-22 19:18:16 1020

原创 数据库中#{}和${}的区别,order by和limit后面${}替换的解决方案

两者区别:#{}是预编译处理,${}是字符串替换(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值,sql在解析的时候会加上" ",当成字符串来解析。例如:#{123456, jdbcType=INTEGER}预编译成:select * from tableName where id = ? ;再变成:select * from tableName where id = '123456' ;(2)mybatis在处..

2022-01-21 23:29:36 3370

空空如也

空空如也

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

TA关注的人

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