- 博客(58)
- 收藏
- 关注
原创 MyBatis解析全局配置文件
2.sql语句在代码中硬编码,造成代码的不已维护,实际应用中sql的变化可能较大,sql代码和java代码没有分离开来维护不方便。4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。4.对结果集中解析存在硬编码问题,sql的变化导致解析代码的变化,系统维护不方便。下面我们看下解析配置文件过程中的一些细节。
2023-11-14 16:58:32
126
原创 SpringMVC
https://www.processon.com/view/link/63f1d5cc2f69f86c1f96ee9c我们在使用SpringMVC时,传统的方式是通过定义web.xml,比如:我们只要定义这样的一个web.xml,然后启动Tomcat,那么我们就能正常使用SpringMVC了。SpringMVC中,最为核心的就是DispatcherServlet,在启动Tomcat的过程中:而在init()方法中,会创建一个Spring容器,并且添加一个ContextRefreshListener监听器
2023-11-14 10:40:23
239
原创 Spring之AOP
DefaultAdvisorAutoProxyCreator的父类是AbstractAdvisorAutoProxyCreator。非常强大以及重要,只要Spring容器中存在这个类型的Bean,就相当于开启了AOP,AbstractAdvisorAutoProxyCreator实际上就是一个BeanPostProcessor,所以在创建某个Bean时,就会进入到它对应的生命周期方法中,比如:在某个Bean初始化之后。
2023-11-06 16:31:42
125
原创 Spring整合Mybatis
但是在Spring整合Mybatis后,如果没有执行某个方法时,该方法上没有加@Transactional注解,也就是没有开启Spring事务,那么后面在执行具体sql时,没执行一个sql时都会新生成一个SqlSession对象来执行该sql,这就是我们说的一级缓存失效(也就是没有使用同一个SqlSession对象),而如果开启了Spring事务,那么该Spring事务中的多个sql,在执行时会使用同一个SqlSession对象,从而一级缓存生效,具体的底层执行流程在上图。
2023-11-01 13:31:58
72
原创 Spring配置类
解析AppConfig类,生成对应的ConfigurationClass再扫描,扫描到的类都会生成对应的BeanDefinition,并且同时这些类也是ConfigurationClass再解析ConfigurationClass的其他信息,比如@ImportResource注解的处理,@Import注解的处理,@Bean注解的处理。
2023-10-31 11:25:47
65
原创 Spring启动过程
通常,我们说的Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。构造一个BeanFactory对象解析配置类,得到BeanDefinition,并注册到BeanFactory中解析@ComponentScan,此时就会完成扫描解析@Import解析@Bean因为ApplicationContext还支持国际化,所以还需要初始化MessageSource对象。
2023-10-30 13:37:01
58
原创 Spring循环依赖
很简单,就是A对象依赖了B对象,B对象依赖了A对象。// A依赖了Bclass A{public B b;// B依赖了Aclass B{public A a;那么循环依赖是个问题吗?如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。比如a.b = b;b.a = a;这样,A,B就依赖上了。但是,在Spring中循环依赖就是一个问题了,为什么?
2023-10-26 11:50:48
103
原创 Spring底层核心原理解析
service.class–>无参构造方法(推断构造方法)–>对象–>依赖注入(有@Autowired的属性赋值)–>初始化前(@postConstruct)–>初始化(implement InitializationBean)–>初始化后(AOP)–>代理对象–>Bean。当我们从Spring容器得到UserService的Bean对象时,拿到的就是UserServiceProxy所生成的对象,也就是代理对象。确定用哪个构造方法,确定入参的Bean对象,这个过程就叫做。
2023-10-16 17:34:51
329
原创 Tomcat隔离web原理和热加载热部署
Spring 作为共享的第三方 JAR 包,它本身是由 SharedClassLoader 来加载的,Spring 又要去 加载业务类,按照前面那条规则,加载 Spring 的类加载器也会用来加载业务类,但是业务类在 Web 应用目录下,不在 SharedClassLoader 的加载路径下,这该怎么办呢?线程上下文加载器不仅仅可以用在 Tomcat 和 Spring 类加载的场景里,核心框架类需要加载具体 实现类时都可以用到它,比如我们熟悉的 JDBC 就是通过上下文类加载器来加载不同的数据库驱动的。
2023-10-10 17:02:26
768
原创 Tomcat 线程模型&性能调优
I/O 调优实际上是连接器类型的选择,一般情况下默认都是 NIO,在绝大多数情况下都是够用的,除非你的 Web 应用用到了 TLS 加密传输,而且对性能要求极高,这个时候可以考虑 APR,因为 APR通过 OpenSSL 来处理 TLS 握手和加密 / 解密。如果你的 Tomcat 跑在 Windows 平台上,并且 HTTP 请求的数据量比 较大,可以考虑 NIO2,这是因为 Windows 从操作系统层面实现了真正意义上的异步 I/O,如果传输的数据量比较大,异步 I/O 的效果就能显现出来。
2023-10-09 16:55:59
499
原创 tomcat整体架构
Tomcat是Apache Software Foundation(Apache软件基金会)开发的一款开源的Java Servlet容器。它是一种Web服务器,用于在服务器端运行Java Servlet和JavaServer Pages (JSP)技术。它可以为Java Web应用程序提供运行环境,并通过HTTP协议处理客户端请求。Tomcat也支持多种Web应用程序开发技术,例如JavaServer Faces (JSF)、Java Persistence API (JPA)等。
2023-10-07 16:24:40
904
1
原创 JVM调优实战及常量池详解
Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthasArthas使用场景得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。Arthas使用用java -jar运行即可,可以识别机
2023-09-28 16:40:13
99
原创 垃圾收集器G1&ZGC
XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。,要回收的集合),尽量把GC导致的停顿时间控制在我们指定的范围内。
2023-09-27 17:26:33
90
原创 垃圾收集器ParNew&CMS与底层三色标记算法
SATB相对增量更新效率会高(当然SATB可能造成更多的浮动垃圾),因为不需要在重新标记阶段再次深度扫描被删除引用对象,而CMS对增量引用的根对象会做深度扫描,G1因为很多对象都位于不同的region,CMS就一块老年代区域,重新深度扫描对象的话G1的代价会比CMS高,所以G1选择SATB不深度扫描对象,只是简单标记,等到下一轮GC再深度扫描。就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。
2023-09-26 16:31:28
195
原创 JVM对象创建与内存分配机制
大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,这个规则其实是希望那些可能是长期存活的对象,尽早进入老年代。如果没有,那必须先执行相应的类加载过程。
2023-09-26 09:50:34
281
原创 JVM内存模型
由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。-Xss:每个线程的栈大小,-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多。-Xmn:新生代大小。
2023-09-25 13:19:55
171
原创 JVM类加载机制
自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是loadClass(String, boolean),实现了。
2023-09-22 17:25:13
227
原创 MySQL全局优化与Mysql8.0新增特性
从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间。CPU:32核内存:64G下面参数都是服务端参数,默认在配置文件的 [mysqld] 标签下连接的创建和销毁都需要系统资源,比如内存、文件句柄,业务说的支持多少并发,指的是每秒请求数,也就是QPS。一个连接最少占用内存是256K,最大是64M,如果一个连接的请求数据超过64MB(比如排序),就会申请临时空间,放到硬盘上。如果3000个用户同时连上mysql,最小需要内存3000。
2023-09-22 10:29:00
128
原创 Innodb底层原理与Mysql日志机制
设置为2:表示每次事务提交时都只是把 redo log 写到操作系统的缓存page cache里,这种情况如果数据库宕机是不会丢失数据的,但是操作系统如果宕机了,page cache里的数据还没来得及写入磁盘文件的话就 会丢失数据。对于设置2,InnoDB 有一个后台线程,每隔 1 秒,就会把 redo log buffer 中的日志,调用操作系统函数 write 写到文件系统的page cache,然后调用操作系统函数 fsync 持久化到磁盘文件。存储引擎层负责数据的存储和提取。
2023-09-21 17:06:30
261
原创 MySQL索引,Explain,事务,锁与MVCC
对于联合索引(a,b,c),使用like的时候(a like ‘a%’ and b=‘b’ and c=‘c’),按理来说like截取以后的字段所对应的后续索引顺序(b,c)已经无法保证,但是MySQL会做出优化,查询到like不会立即回表,而是把后续的字段匹配再回表,减少了回表次数;换一种说法,使用B+树将能存储更多的索引。join的时候,如果外键是索引,实行NLJ算法,流程为将小表数据取出,与大表的索引匹配(大表有索引所以匹配很快),如果小表数据100大表一万,将进行大小表各100次磁盘扫描。
2023-09-21 11:20:12
73
原创 docker常用命令
拷贝docker内部文件到主机 docker cp :/home/nacos/conf /dockerdata/nacos/进入容器 docker exec -it /bin/bash。重启容器 docker restart 查看容器信息 docker inspect 容器名。停止容器 docker stop 删除容器 docker rm 开启容器 docker start 容器名。删除镜像 docker rmi 镜像名。
2023-09-12 17:16:58
116
原创 Vue3+Element plus+pageHelper实现分页
/ 注意reactive可能遇到响应失效的情况,可使用ref([]) https://blog.csdn.net/m0_57033755/article/details/129043116。
2023-08-11 09:41:53
895
原创 前端技术Html,Css,JavaScript,Vue3
Html1.基本标签<h1>最大的标题</h1><h2> . . . </h2><h3> . . . </h3><h4> . . . </h4><h5> . . . </h5><h6>最小的标题</h6> <p>这是一个段落。</p><br> (换行)<hr> (水平线)<!-- 这是注释
2023-08-07 17:02:47
2757
3
原创 Java使用JNA调用C文件
准备最简单的maven项目,结构如下:引入依赖:2.构建c文件和so文件在resource目录下构建:编译生成so:
2023-07-12 15:39:24
497
原创 Debian使用tomcat部署项目
验证Tomcat是否正常运行:在Web浏览器中访问 http://localhost:8080,如果看到Tomcat的默认欢迎页面,则表示安装成功。
2023-07-06 17:21:08
1589
原创 Tomcat学习
tomcat接受到socket请求获取数据,根据应用层协议(http)解析为request请求,其中上图中的Endpoint代表io模型,常用的为BIO和NIO,例如配置HTTP1.1的时候tomcat7默认使用BIO。请求-》engine-》engine的阀门-》host-》host的阀门-》context-》context的阀门-》wrapper-》wrapper的阀门。engine ,host虚拟主机,context应用,wrapper类型分组。阀门valve是容器之间的桥梁,可以传输数据。
2023-07-05 17:28:34
638
原创 SQL相关
关于join on后面使用and时的情况,例如a left join b on a.id=b.id,会将左边表的列全部显示,如果添加a left join b on a.id=b.id and b.bonus
2023-06-29 10:34:51
1345
原创 Deb包制作,Rpm包熟悉,Makefile文件制作
除了上述常用命令外,Makefile还支持自定义命令。test:这条规则的作用是运行项目的测试脚本。
2023-06-21 14:48:53
508
原创 Win10上安装和使用Kafka
一:下载Kafka在官网http://kafka.apache.org下载压缩包二:安装1.解压到指定的文件夹下2.创建两个文件夹以供后续使用3.修改配置文件3.1修改kafka_2.12-2.6.0\config\zookeeper.properties文件3.2修改kafka_2.12-2.6.0\config\server.properties文件三:使用(1) 启动kafka内置的zookeeper运行cmd命令:.\bin\windows\zookeeper-se
2020-10-28 15:55:39
503
原创 Win10上安装和使用MongoDB-4.0.21-rc1
一,安装1.官网下载相应的软件2.按照下图依次点击安装此时安装完成以后会发现启动项中的MongoDB正在运行(后续每次使用MongoDB需要手动启动)在安装目录 data 文件夹下创建 新的文件夹 db,在 log 文件夹下创建新文件 mongo.log此时访问http://localhost:27017/出现以下界面内容说明安装完成二,使用管理员身份打开下面的EXE文件即可输入命令行...
2020-10-23 16:13:28
267
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人