- 博客(28)
- 收藏
- 关注
原创 mybatis一级缓存
这里我们进入createCacheKey方法查看,从源码里面可以得知,将MappedStatement的Id、SQL的offset、SQL的limit、SQL本身以及SQL中的参数传入了CacheKey这个类,最终构成CacheKey。cachekey方法的equals被重写,从源码可以得知,除了hashcode、checksum和count的比较外,只要updatelist中的元素一一对应相等,那么就可以认为是CacheKey相等。baseExecutor里面的query方法具体实现如下。
2025-02-07 17:55:44
338
原创 springcloud网关处理导致的请求体参数问题
在默认编码(UTF-8)下,一个中文字符占 3 个 byte,当请求体中包含中文时,就会有可能出现一个中文字符被分割在两个相邻的缓冲区的情况。上述代码中,采用的是将每一个缓冲区中的内容逐个解析,最后进行拼接,由于缓冲区的存在,可能会一个字符分在两个缓冲区里面,会导致被分割的中文字符的 byte 无法正确转回字符串,影响最终报文内容。因此,Netty 和 Spring WebFlux 都支持分段的请求体处理,当客户端发送一个大的请求体时,Netty 会自动将数据分段存储在 ByteBuf 中。
2025-01-24 15:53:35
224
原创 hashmap解析
本文只讨论Java8的hashmap结构,先从它的putVal源码看着走吧final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0)
2025-01-06 10:59:09
73
原创 @postconstract执行源码解析以及和InitializingBean执行顺序
平时写代码时,对bean进行执行一些初始化操作时,会用到@postconstract,也用过InitializingBean的afterPropertiesSet实现,也有使用@bean标注initmethod方式,那么这几种方式有何不同呢,执行顺序是什么呢?1 写个简单的类,里面写一个方法,打上@postconstract注解,然后启动项目。此时可以看到执行调用栈信息如下,我们一步一步往上执行探索。首先看到是InitDestroyAnnotationBeanPostProcessor.invoke
2024-12-09 16:29:45
538
原创 spring默认代理模式
JDK动态代理只能代理实现类接口的类,CGLB没有此类限制,为了保证springboot的AOP在任何环境都能正常使用,所以默认使用CGLB代理。还有人在说springboot默认使用JDK代理模式,想当初也坑过我,话不多说,代码展示。充分说明,不管是注入接口还是它的实现类,最终结果都是使用的CGLB代理。
2024-11-27 15:54:28
253
原创 header or cookietoo large
都在大家以为肯定不行的时候,他的请求成功了,这就令我们更加不解了,为什么他的postman可以,随后大家又用自己电脑试了试还是不行,唯有他的电脑可以,大家都一脸疑惑,直到我突然发现一个不一样的地方,这位同事请求的时候,使用的https,可能是他打错了,而我们大家使用的都是http,而我这个项目确实之前一直是http请求。立马加上了如图所示的配置,然而在自己以为问题就此解决的时候,发现接口请求依然还在报这个错,于是去仔细查了查日志,并未发现日志报错,使用apifox调用接口时,发现报错如下,
2024-09-04 18:12:23
872
原创 逆天日志打印导致的springboot上传文件失败
但是再看源码的时候发现,执行删除操作的时候,程序执行失败,异常是被抛掉了,并不会影响程序继续执行,但是我的项目里面的上传功能是直接被阻断了,程序无法进行,看到这里,我就觉得很奇怪了,到底是哪里主动抛出了异常,阻断了程序执行,一时没有头绪。于是我打断点,看下执行的堆栈信息,一路沿着源码往上执行,最终找到了程序异常的地方。由项目里面有一个环绕日志打印的切面引起(这个日志打印没用,应该是之前同事复制的以前哪个项目的),这个切面用于接口日志打印,而就是在日志打印的时候,引起的上传功能报错,罪魁祸首如下。
2024-09-04 17:18:31
549
原创 goland使用go get无法下载资源问题
如果执行命令出现warning: go env -w GOPROXY=…does not override conflicting OS environm。查看电脑环境变量是否存在这个值,存在的话,在环境变量里面修改保存即可,如果不存在建议重启电脑即可恢复。使用国内七牛云的 go module 镜像。阿里云 Go Module 国内镜像仓库服务。2 访问限制,需要开启代理访问,操作如下。Go 1.13 及以上(推荐)。1 项目没有go.mod文件。通过命令创建g.mod文件。使用go1.11以上版。
2023-06-28 17:56:23
1142
1
原创 关于idea使用debug启动出现com.intellij.rt.debugger.agent.CaptureAgent,必须使用管理员运行idea才能启动,以及idea命令行terminal空白
前言之前在一次学习过程中,使用vscode出现乱码,于是百度搜了一个解决方案,其中一条解决如下图当时使用此方法后,并未发现idea出现了问题,于是就没有在意,第二天一早来上班,启动电脑,打开idea运行项目,出现 java.io.IOException: Cannot create empty file: \XXXXX(目录),百度搜索此问题解决方法通过管理员运行idea,正常运行后,又发现,改了代码后重新运行项目,代码并没有生效,网上各种解决编译生效的方法都用了,无效果,然后又发现使用idea的de
2022-04-27 09:54:18
1836
2
原创 mysql的count(*),count(1),count(字段),count(主键ID)效率分析
mysql的count(*),count(1),ocunt(字段)效率分析
2022-04-18 14:48:50
1065
1
原创 @transactional失效场景实测
事务失效的一些情况实测@Transactional注解失效,大致会有以下几种场景:调用本类的方法调用外部类的方法(A类 B类)事务传播机制@Transactional注解失效,大致会有以下几种场景:数据库引擎是否支持事务(Mysql 的 MyIsam引擎不支持事务);注解所在的类是否被加载为 Bean(是否被spring 管理);注解所在的方法是否为 public 修饰的;是否存在自身调用的问题;所用数据源是否加载了事务管理器;@Transactional的扩展配置propagation是否正
2022-04-14 15:55:44
520
转载 freemaker常用的语法大全
FTL指令常用标签及语法注意:使用freemaker,要求所有标签必须闭合,否则会导致freemaker无法解析。freemaker注释:<#– 注释内容 –>格式部分,不会输出———————————- 基础语法 ———————————-1、字符输出${emp.name?if_exists} // 变量存在,输出该变量,否则不输出${emp.name!} ...
2020-04-09 14:38:35
1467
1
转载 如何设计一个秒杀系统
什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。秒杀系统场景特点秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够...
2019-08-22 16:40:54
99
转载 Spring、SpringMVC、Shiro面试题
开发中主要使用 Spring 的什么技术 ?①. IOC 容器管理各层的组件②. 使用 AOP 配置声明式事务③. 整合其他框架.简述 AOP 和 IOC 概念AOP: Aspect Oriented Program, 面向(方面)切面的编程;Filter(过滤器)也是一种 AOP. AOP 是一种新的方法论 , 是对传统 OOP(Object-Oriented P...
2019-08-20 17:53:35
353
转载 redis的相关问题
昨天写了一篇自己搭建redis集群并在自己项目中使用的文章,今天早上看别人写的面经发现redis在面试中还是比较常问的(笔主主Java方向)。所以查阅官方文档以及他人造好的轮子,总结了一些redis面试和学习中你必须掌握的问题。事无巨细,不可能囊括到所有内容,尽量把比较常见的写出来。欢迎关注我的微信公众号:“Java面试通关手册”,也可以加我微信:“bwcx9393”与我学习交流。什么是Redi...
2019-08-15 19:52:38
96
转载 数组和集合
一、数组数组是java语言内置的数据类型,他是一个线性的序列,所有可以快速访问其他的元素,数组和其他语言不同,当你创建了一个数组时,他的容量是不变的,而且在生命周期也是不能改变的,还有JAVA数组会做边界检查,如果发现有越界现象,会报RuntimeException异常错误,当然检查边界会以效率为代价。二、集合JAVA还提供其他集合,list,map,set,他们处理对象的时候就好像这些对象...
2019-08-15 16:49:22
118
转载 实体bean为什么一定要实现Serializable接口
一、什么是序列化In computer science, in the context of data storage, serialization is the process of translating data structures or object state into a format that can be stored (for example, in a file or me...
2019-08-14 11:31:37
353
转载 某些java类为什么要实现Serializable接口
什么是Serializable接口?一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化什么是序列化?将对象的状态信息转换为可以存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时存储区或持久性存储区,之后,便可以通过从存储区中读取或反序列化对象的状态信息,来重新创建该对象什么情况下需要序列化?当我们需要把对象的状态信息通过网络进行传输,或...
2019-08-14 11:30:44
177
转载 java中的垃圾回收机制
我们这里找了两张搞笑图片分别来表示c语言的垃圾回收和 java的垃圾回收。注意:并不是说谁好谁坏,只是一个调侃图。c语言:java语言:c的垃圾回收是人工的,工作量大,但是可控性高。java是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况,内存溢出也就是jvm分配的内存中对象过多,超出了最大可分配内存的大小。c的垃圾回收是人工的,工作量大,但是可控性高。java是自动化的,...
2019-08-12 19:05:57
96
转载 sleep与wait的区别
sleep让当前线程休眠指定时间。休眠时间的准确性依赖于系统时钟和CPU调度机制。不释放已获取的锁资源,如果sleep方法在同步上下文中调用,那么其他线程是无法进入到当前同步块或者同步方法中的。可通过调用interrupt()方法来唤醒休眠线程。wait让当前线程进入等待状态,当别的其他线程调用notify()或者notifyAll()方法时,当前线程进入就绪状态wait方法必须在同...
2019-08-10 16:35:55
139
转载 Runnable接口和Callable接口的区别
Runnable需要实现run()方法Callable需要实现call()方法Runnable从jdk1.1开始加入Callable从jdk1.5开始加入区别1: 两者最大的区别,实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回执行结果注意点:Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会...
2019-08-10 16:31:07
1983
转载 voliate解决重排序
voliate关键字的两个作用1、 保证变量的可见性:当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量写入数据的时候,虚拟机会强制它被值刷新到主内存中。当一个线程用到被volatile关键字修饰的值的时候,虚拟机会强制要求它从主内存中读取。2、 屏蔽指令重排序:指令重排序是编译器和处理器为了高效对程...
2019-08-10 12:30:17
746
转载 完美的单利模式
为什么要用单例模式?优秀的设计结构可以规避很多潜在的性能问题,对系统性能的影响可能远远大于代码的优化,所以我们需要知道一些设计模式和方法。单例模式:单例模式是一种对象创建模式,用于生产一个对象的实例,它可以确保系统中一个类只产生一个实例,这样做有两个好处:1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。2.由于new操作的次数减少...
2019-08-10 11:59:27
103
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人