自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 String的intern()方法详解

在开发过程中很多朋友,由于不会正确使用intern(),导致开发的程序,执行效率比较差。同时最近发现一道非常有意思的关于intern()的面试题,这道面试题还是有不小的难度,相信很多朋友看到以后也不知道怎么解答,所以今天咱们深入详解下intern()。当调用intern()时,如果池子里已经包含了一个与这个String对象相等的字符串,正如equals(Object)方法所确定的,那么池子里的字符串会被返回。否则,这个String对象被添加到池中,并返回这个String对象的引用。

2023-10-16 17:48:53 268

原创 双亲委派机制的作用

我自己定义了一个String的类,如果我创建了这个类。那么肯定是会打印123的。(该类在我的java.lang目录下)/***/然后我又创建了一个A类,在这个main方法中new了一个String对象。按我们正常逻辑是不是会打印123,并且创建这个String对象。但是结果并没有进行,创建的还是我们jdk中java.lang包下的String对象,而不是我们定义的String对象。为什么会这样,这就涉及到我们的jvm的双亲委派机制了。

2023-09-05 11:28:15 218

原创 SpringBoot的自动装配源码分析

在传统的Spring框架中,我们需要手动配置和管理Bean的依赖关系,但在Spring Boot中,大量的配置可以自动完成。这是因为Spring Boot中引入了自动装配的概念。自动装配指的是根据应用程序的依赖关系自动配置Spring Bean,而无需手动配置。手动装配比如在下面代码中,我创建了一个cat和一个dog。然后通过手动方式把他注入到people类的属性cat和dog中。自动装配。

2023-08-30 18:46:14 480

原创 Spring 事务源码分析

Spring事务是一种用于管理数据库操作的机制,它确保一组相关的数据库操作要么全部成功提交,要么全部失败回滚。事务可以保证数据的一致性和完整性。在Spring中,事务可以通过编程式事务管理和声明式事务管理两种方式来实现。编程式事务管理是通过编写代码来手动管理事务的开始、提交和回滚。而声明式事务管理是通过在方法或类级别上添加注解来指定事务的属性,Spring框架会自动管理事务的开始、提交和回滚。原子性(Atomicity):事务中的所有操作要么全部成功提交,要么全部失败回滚。

2023-07-20 18:39:33 267

原创 Mybatis自定义分页插件及PageHelper源码分析

Mybatis作为一个应用广泛的优秀的ORM开源框架,这个框架具有强大的灵活性,在四大组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易用的插 件扩展机制。Mybatis对持久层的操作就是借助于四大核心对象。MyBatis支持用插件对四大核心对象进行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象。

2023-06-01 14:48:25 1638

原创 mybatis的一级二级缓存详解及源码解剖

一级缓存是指在同一个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。一级缓存是MyBatis默认开启的,可以通过在SqlSession中调用clearCache()方法来清空缓存。二级缓存是指在多个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。二级缓存是需要手动开启的,可以通过在Mapper.xml文件中添加标签来开启。

2023-05-19 14:44:20 2051

原创 mybatis连接池源码分析

其实大部分连接池的代码都大同小异,总体获取连接,归还连接逻辑大都相同。希望通过阅读本文章,能给你带来帮助。测试用例// 1.读取配置文件获取SqlSessionFactory SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder . build(inputStream);// 2.获取sqlsession SqlSession sqlSession = sqlSessionFactory . openSession();

2023-05-14 22:21:38 724 1

原创 SpringMVC(三):请求流程处理

如下是我画的一个简单的SpringMVC的请求流程图,接下来会通过请求流程图去进行源码分析。HandlerExecutionChain: 请求处理链,包括请求处理器和处理器拦截器等。它的作用是在请求处理过程中,按照一定的顺序调用各个处理器,确保在请求处理器执行前后,能够按照需要进行预处理和后处理。

2023-04-16 23:28:56 618

原创 SpringMVC(二):加载SpringMVC的九大组件之initHandlerMappings

在前面容器创建完成后,调用refresh方法时,spring会把所有的单例bean加载完成刷新后,会调用onApplicationEvent()监听事件,紧接着就会在调用DispatcherServlet的onRefresh()方法,进行9大组件的加载Spring MVC九大组件的名称和作用。由于精力有限,就通过initHandlerMappings的源码来看看springMVC是怎么去寻找我们设置的controller的,怎么去找到存储我们对RequestMapping对应请求的。

2023-04-09 15:51:42 409 1

原创 SpringMVC(一):初始化流程

我建立了一个SpringMVC的项目并且配置了一个tomcat,配置文件内容如下。web.xml配置文件mvc.xml配置文件。

2023-04-07 17:34:11 629 1

原创 Jdk动态代理和Cglib动态代理的区别

最后我们总结一下JDK动态代理和Gglib动态代理的区别:1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。

2023-03-25 18:38:48 997

原创 linux部署netdata监测

将这四个文件放置/usr/local/src/netdata-v1.12.0/web/gui。访问地址:http://127.0.0.1:19999/

2023-02-28 10:44:47 193

原创 Spring是怎么解决循环依赖的

1.Spring有哪三级缓存// 从上至下 分表代表这“三级缓存” //一级缓存 用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用 private final Map < String , Object > singletonObjects = new ConcurrentHashMap < >(256);

2023-02-26 14:09:21 717

原创 SpringBean的生命周期

在这一步主要做的就是类的定义,也就是做我们BeanDefinition的内容。ComponentScan:主要是定义spring要扫描哪些包下的文件,需要把哪些文件加入spring容器中。在确定我们扫描哪些包下的文件后,会先过滤不是.class的文件。然后在判断对应的.class类的文件是否存在Component注解。这个时候也会获取我们Com

2023-02-23 18:32:47 343

原创 java世界String的那些事

final可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。那么为什么要保证String不可变呢?因为只有当字符串不可变时,才能实现字符串池。提高程序的效率。字符串池可以节约很多Heap空间,因为不同的字符串都指向了同一个字符串。但如果字符串是可变的,字符串池将不能被实现,因为字符串可变的话,如果变量改变了它的值,那么其它指向这个地址的字符串的值也会被改变。

2023-02-10 15:47:07 454

原创 该怎么去理解java中的异常

如果需要堆栈,但又没有收集这些信息,在复杂情况下,尤其是类似微服务这种分布式系统,会大大增加诊断的难度。综上,从一个常见的异常处理概念问题,简单总结Java异常处理的机制,并结合代码分析了一些普遍认可的最佳实践,以及业界最新的一些异常使用共识。这是因为在日常的开发和合作中,读代码的机会往往超过写代码,有义务让自己的代码能够直观地体现出尽量多的信息,而泛泛的Exception恰恰隐藏了我们的目的。生吞异常,往往是基于假设这段代码可能不会发生,或者感觉忽略异常是无所谓的,但是千万不要在产品代码做这种假设。

2023-02-07 18:01:45 475

原创 java到底是解释执行还是编译执行?

今天听到同事在讨论java是哪种类型的语言(编译型、解释型),以前稍微有些接触,但是概念比较模糊。所以今天通过资料查阅资料了解了一下。

2023-02-06 15:09:57 1219

原创 MySQL执行顺序及优化

在上述例子中,如果我们join_buffer更小,被驱动表就会被多次扫描,而且这个语句执行时间超过 1 秒,就会在再次扫描t2表的时候,把t2表的数据页移到 LRU 链表头部。在多个条件下,无法判断哪一个会先执行,往往会先执行1=1,在大数据执行情况下会消耗MySQL的性能,在使用mybatis时,可以用where标签代替。max_length_for_sort_data表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为单行太大,就换rowid 排序。

2023-01-07 17:30:13 2337

原创 kkfile在线文件预览部署(Linux服务器版本)

KKfile文件预览是一款开源的文档在线预览项目。项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,Excel,pdf,txt,zip,rar,图片等等。如果你是在windows系统中可以不用安装openoffice,因为window操作系统会自带openoffice。如果你是在Linux操作系统当中,首先你就需要安装openoffice。如果不安装的话,启动就会报以下错误。

2022-12-24 14:42:01 6579 7

原创 MySQL自增主键一定是连续的吗

自增锁是一种比拟非凡的表级锁。并且在事务向蕴含了 AUTO_INCREMENT 列的表中新增数据时就会去持有自增锁,假如事务 A 正在做这个操作,如果另一个事务 B 尝试执行 INSERT语句,事务 B 会被阻塞住,直到事务 A 开释自增锁。

2022-12-21 14:50:57 1037 1

原创 mybatis以及mybatisplus批量插入问题

方案一 就是用 for 循环循环插入:优点:JDBC 中的 PreparedStatement 有预编译功能,预编译之后会缓存起来,后面的 SQL 执行会比较快并且JDBC 可以开启批处理,这个批处理执行非常给力。缺点:很多时候我们的 SQL 服务器和应用服务器可能并不是同一台,所以必须要考虑网络 IO,如果网络 IO 比较费时间的话,那么可能会拖慢SQL 执行的速度。

2022-12-12 18:00:17 10317 1

原创 一篇文章了解MySQL的group by

1.本文章MySQL使用的是5.7,引擎使用的是innodb2. 使用的表结构(t1),字段a上有一个索引,group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。聚合函数:示例1: 查询t1表,按照字段b进行分组,并求出分组后b字段a的总和。实例2:查询t1表,按照字段b进行分组,拿到b

2022-12-04 19:32:00 10172 1

原创 MySQL的join你真的了解吗!!!

1. 应该使用小表作为驱动表2. 被驱动表关键字段应该建立索引3.被驱动表无法使用索引、数据量很大时,因适当调整join_buffer大小。避免 Buffer Pool 的热数据被淘汰,影响内存命中率。4.MySQL8.0之后版本,已经支持hash join,没有升级的小伙伴赶紧升级把!!!阿根廷加油,梅老板牛逼!!!

2022-11-27 18:31:33 2664 3

原创 MySQL的缓冲池(buffer pool)及 LRU算法

buffer pool 是数据库的一个内存组件,里面缓存了磁盘上的真实数据,Java系统对数据库的增删改操作,主要是这个内存数据结构中的缓存数据执行的。控制块存的是 数据页所属的表 空间号,数据页编号,数据页地址等信息是放在缓存页的前面控制块占缓冲页百分之5左右的内存大小缓存页1.buffer pool中存放的数据页我们叫缓存页,和磁盘上的数据页是一一对应的,都是16KB2.缓存页的数据,是从磁盘上加载到buffer pool当中的。

2022-11-19 20:49:24 1673

原创 MySQL是如何保证高可用的

主备延迟指的是主库执行完成的时间和备库执行完成的时间的差距主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;备库 B 执行完成这个事务,我们把这个时刻记为 T3。所以主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1。

2022-11-12 21:27:59 3440 3

原创 MySQL是如何保证主从一致的

Binary log(二进制日志),简称Binlog。Binlog是记录所以数据表结构变更以及表数据修改的二进制日志,不会记录select和show这类操作。Binlog是以事件形式记录,还包括语句所执行的消耗时间。Binlog是MySql Server自己的日志,但是Redo Log是基于InnoDB引擎所特有的日志。它是一个逻辑日志。主从复制在主库开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。数据恢复。

2022-11-02 10:02:15 12507 4

原创 MySQL是如何保证数据不丢失的

1.SQL语句(update user set name=‘李四’ where id=3)的执行流程是怎样的呢?1.执行器先找引擎取 ID=3这一行。ID 是主键,引擎直接用树搜索找到这一行。2.如果 ID=3 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。3.执行器拿到引擎给的行数据,把name这个值改成李四 得到新的一行数据,再调用引擎接口写入这行新数据。

2022-10-27 09:22:22 11190 7

原创 MySQL思维导图

MySQL思维导图

2022-10-24 09:41:53 2115

原创 一篇文章搞懂MySQL的order by

因为上面全字段排序sort_buffer确定的是first_name, last_name,score,copy_id四个字段,而这里rowid排序确定的是copy_id 和 id,大大的减少sort_buffer的大小。3.到主键 id 索引取出整行,first_name, last_name,score,copy_id 这四个字段,存入sort_buffer 中;1.初始化 sort_buffer,确定放入 first_name, last_name,score,copy_id 这四个字段;

2022-10-17 22:57:13 7315 19

原创 Activiti工作流并行网关驳回在发起问题

它记录了人员3(同意),人员4(同意),人员5(同意)三次记录。导致第二次审批时,并行节点有一个同意,就走到了人员7节点。流程从发起人走到并行节点 -> 人员3,和人员4,人员5,人员6是并行。人员3(同意),人员4(同意),人员5(同意),人员6(不同意)回到发起人节点。因为驳回操作会删除其他表记录,删除这几条记录不会因为主键影响报错。流程又开始从发起人走到人员3,人员4,人员5,人员6并行节点。这时会出现一个问题?最后发现问题出现在运行时流程执行实例表( act_ru_execution )

2022-10-11 16:27:19 5386 8

原创 MySQL(Select count(*))为什么这么慢!!!

3.如果能将数据统一在同个载体即MySQL,并由其保证操作的原子性,即将插入一行数据和计数加1作为一个完整的事务,通过事务的隔离此时外界看到的就是要么全部执行完毕要么全部都没执行,进而保持逻辑一致。此外需要注意的是,我们在这篇文章里讨论的是没有过滤条件的 count(其实MySQL是做了优化的,因为InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的。

2022-10-08 22:12:39 11710 6

原创 MySQL数据切割换行,数据拆分

比如“www.mysql.com”截取字符‘www’,分割符为“.”,从左到右序号为1,即substring_index(“www.mysql.com”,‘.’,1);若从右开始获取“com”则为序号为-1即substring_index(“www.mysql.com”,‘.’,-1)语法: REPLACE ( string_expression , string_pattern , string_replacement)sep:分隔符,string存在且用于分割的字符,比如“,”、“.”等。

2022-09-27 17:09:30 2422 2

原创 使用Mybatis实现简单树形结构数据接口渲染

1.执行SQL select id, pid, cityname, type, content from tb_test where pid = #{pid}3. collection 又执行selectTbTestList。4.又进入了此查询下面的市进行了递归。2. resultMap进行了封装。默认查询pid为0的中国数据。

2022-09-22 18:02:13 2101 1

原创 一篇文章了解Like用法及常见索引失效情况

本文主要通过介绍Like索引优化以及全文索引,以MySQL为例。reverse()应用场景,比如你根据身份证查询一个市洲的人员信息。众所周知,同一个市洲大部分人员身份证前6位是相同的,比如黄石,前六位420222。这个时候你就可以通过reverse()字段,创建身份证后6位的前缀索引进行查询。**

2022-09-20 23:11:10 11262

原创 MySQL重建表

总所周知MySQL数据结构是B+树,现在假设删除掉r4的记录,InnoDB只会把r4这个记录标记为删除,如果之后插入一条10-20的记录,就会复用这个r4的位置,但是磁盘文件的大小并不会因为标记为删除而减小,类似于假删除。因为,一个表单独存储为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会直接删除这个文件。如果我们把表B作为临时表,数据从表A导入表B的操作完 成后,用表B替换A,从效果上看,就起到了收缩表A空间的作用。因此,在整个DDL过程中,表A中不能有更新。

2022-09-17 23:04:20 4068

原创 MySQL的刷脏页策略

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。 1.当我们修改一条数据时,如果数据在内存中,我们是先会去改内存的,而不是先去改磁盘。假如数据都在内存中,这时候断电了怎么办,服务器宕机怎么办,这个时候就需要我们的redo log了。 在每一条数据更新时,MySQL会先写redo log日志,在去写binlog 日志。在写这两个日志过程中会涉及到**两阶段提交**。他可以保证两个日志逻辑上的一致性。所以即使因为停电,宕机等原因,MySQL也可以通过redo log将数据进行恢复。

2022-09-12 13:41:46 3711 1

原创 MySQL数据库备份(Linux操作系统)

查看定时任务日志出现这个错误 /bin/bash^M: bad interpreter: No such file or directory。在/home/backups/下建立.sh文件,文件名称。#输入以下代码 表示每天01:01自动执行代码。输入crontab -e,开始编辑定时任务。输入:wq 保存退出。查看定时任务执行命令。出现以下表示备份成功。

2022-09-03 22:55:12 10802 1

原创 HttpURLConnection获取400问题

记录一次使用HttpURLConnection或HttpsURLConnection获取文件400报错问题,及解决办法。话不多说直接上代码。请求路径,http:// 192.168.57.** :8080/upload/file/小学生报名表_20220829215306A002.xlsx报错如下:400。

2022-09-03 20:49:43 4959 1

原创 MySQL的change buffer

这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价,这个时候普通索引就不是最好的选择了。而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在 change buffer中,这样就不需要从磁盘中读入这个数据页了。第二种情况是,这个记录要更新的目标页不在内存中。唯一索引,找到 3 和 5 之间的位置,判断到没有冲突,插入这个值,语句执行结束;唯一索引,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结 束;......

2022-08-28 15:47:42 2396

原创 MySQL有哪些锁

你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。什么是全局锁,全局锁就是让数据库处于只读的状态,而在这个状态过程中,整个数据库的(增删改)会被阻塞,整个数据库的定义语句(表的修改,新增,删除)也会被阻塞,包括更新类事务的提交语句。在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。读锁是共享锁,加上后其他锁只能读不能写,本线程也不能写。.....

2022-08-28 14:48:42 4221 1

空空如也

空空如也

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

TA关注的人

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