自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (4)
  • 收藏
  • 关注

原创 数据结构之——平衡二叉树(内容详解)

一、基本概念平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。二、结构如基本概念所树,它具有一个左子树和一个左子树,且对于任意一个子树而言,左子树和右子树高度只差不超过1.2.1 平衡二叉树判别如下有3棵树,分别判断下哪个是平衡二叉树?图1:图2:...

2019-12-29 19:17:16 91309 47

原创 HashMap源码解析JDK1.8

今天,打算写一篇HashMap的源码解析,主要是针对增删改查操作,废话不多说,直接开始。 先看看hashMap在jdk 1.8的结构,如下图,用的是数组+链表+红黑树的结构,也叫哈希桶,在jdk 1.8之前都是数组+链表的结构,因为在链表的查询操作都是O(N)的时间复杂度,而且hashMap中查询操作也是占了很大比例的,如果当节点数量多,转换为红黑树结构,那么将会提高很大的效率,因为红黑...

2018-09-03 11:10:11 25331 19

原创 MongoDB入门教程(1)

(一)MongoDB介绍 MongoDB是一个NoSQL数据库,它是跨平台的,基于分布式文件存储的数据库,由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境)。MongoDB是以文档的形式存储数据,数据结构由键值(key:value)对组成,类似JSON。 MongoDB结构,最小的单位为文档(类似MySQL的行),每一个文档用的是B...

2018-08-23 11:24:30 18812 4

原创 Go在1.22版本修复for循环陷阱

官网地址:https://golang.google.cn/blog/go1.22。经过测试,该问题仅针对for循环中使用闭包,别的闭包效果还是跟原来一样。前段时间升级Go版本碰到一个大坑,先记录。查阅了半天资料,最终在官网中找到答案。

2025-02-27 22:53:46 348

原创 Go中slice和map引用传递误区

关于slice和map是指传递还是引用传递,很多文章都分析得模棱两可,其实在Go中只有值传递,但是很多情况下是因为分不清slice和map的底层实现,所以导致很多人在这一块产生疑惑,下面通过代码案例分析slice和map到底是值传递还是引用传递。

2025-02-26 22:48:48 477

原创 Go基于协程池的延迟任务调度器

创建一个延迟调度任务器,workerNum是协程数量,options是ants协程池的配置,除了WithMaxBlockingTasks不能配置,别的都可以,具体参考:https://github.com/panjf2000/ants。主要是用于高并发及大量定时任务要处理的情况,如果使用Go协程来实现每次延迟任务的调度,那么数量极大的goroutine将会占用内存,导致性能下降,使用协程池实现延迟任务的调度,会改善该情况。代码加上详细的中文注解,一共300行。

2025-02-25 22:14:27 435

原创 Tomcat调优参数

Tomcat是一个Web容器,所有的jar其实都共享Tomcat中的JVM参数,所以Tomcat的JVM参数优化至关重要。Tomcat的JVM参数是在启动脚本中设置的,如想要设置最大堆内存和最小堆内存时:在windows的启动脚本catalina.bat中的set "CURRENT_DIR=%cd%"下面,添加 set JAVA_OPTS=-Xms512m -Xmx512m -XX:ParallelGCThreads=8 -XX:PermSize=128m -XX:MaxPermSize=256m。

2024-05-26 22:58:24 624

原创 Tomcat源码解析——热部署和热加载原理

在Tomcat中可以通过Host标签设置热部署,当 autoDeploy为true时,在运行中的Tomcat中丢入一个war包,那么Tomcat不需要重启就可以自动加载该war包。Tomcat的容器中都包含有 backgroundProcessorDelay 属性和 backgroundProcess方法,默认的实现是,在每个容器启动时,当backgroundProcessorDelay大于1时(单位是秒),则会周期性的执行当前容器及所有子容器的backgroundProcess方法。

2024-04-21 21:27:31 1135

原创 Tomcat源码解析——类加载机制

在之前的Tomcat启动源码中,简单的介绍了Tomcat的四种类加载器,再复习一遍。类加载器类加载器的结构层次:commonLoader、catalinaLoader、sharedLoader可以在tomcat下的conf/catalina.properties文件中修改。在Tomcat的启动中,一开始就创建了commonLoader、catalinaLoader、sharedLoader类加载器并且加载对应设置的资源。

2024-04-20 21:05:38 1062

原创 Tomcat源码解析——一次请求的处理流程

在SocketProcessor的run方法中,异步的进行解析,用对应的协议处理器处理,然后开始解析请求首行,请求头,等到解析完成并且没有错误时,则通过Adapter(适配器)的service方法,将请求传递给容器(Engine、Host、Context、Wrapper)。终于,在Wrapper中,Tomcat通过单例模式创建出用户自定义的Servlet,然后经过过滤器链的处理后,调用到Servlet的service方法中,此方法也是给用户实现处理请求的最终方法。

2024-04-20 11:59:38 605

原创 Maven获取版本号工具类

【代码】Maven获取版本号工具类。

2024-04-18 11:19:07 651

原创 Tomcat源码解析——Tomcat的启动流程

在Catalina的load方法中,会找到server.xml文件,然后解析标签并创建出对应的实例对象,最终在调用最顶层的Server组件的init方法,会调用Service组件的初始化,而Service组件的会调用Connector组件的初始化(容器的初始化是懒加载的,即有请求达到时才开始初始化)。在catalina.sh脚本中,前面是环境判断和初始化参数,最终根据传递的start来执行上图的代码,最终会调用Tomcat的Bootstrap启动类的main方法,传递的参数是start。

2024-04-14 22:57:24 2621 1

原创 Tomcat源码解析——源码环境搭建

在进行源码阅读前,先下载源码包,这样便于做笔记和debug。我所用的版本是Tomcat7.0.68,JDK版本,我用的是1.8,可以使用其它版本,如果其它版本不行则可以换到1.8尝试。

2024-04-14 19:23:30 1022

原创 Tomact源码解析——组件介绍

Tomcat的体系结构如图所示:Tomcat的体系结构分为两层,一层是Tomcat管理组件,一层是Tomcat容器组件;而Connector(连接器)是沟通管理组件和容器组件的桥梁,Connector将一个请求传递至Container,容器自上而下的去处理该请求。Tomcat的管理组件:Server、Service此类组件主要是为了管理好Tomcat下级的各项组件以及内容。容器组件:Engine、Host、Context、Wrapper。

2024-04-14 18:09:33 852

原创 Netty-客户端及服务端代码模板

一、服务端代码模板public class NettyServer { public static void main(String[] args) throws InterruptedException { //server启动器 ServerBootstrap serverBootstrap = new ServerBootstrap(); //boss线程组,监听端口链接 NioEve

2021-09-06 09:50:16 1464

原创 Mybatis实用功能——动态数据源

一、动态数据源动态数据源是一个很实用的功能,能够在运行时切换数据源执行不同的数据库操作,下文将通过spring整合Mybatis手写一个动态数据源,主要使用到的技术有AOP、静态代理模式,本文主要内容是动态数据源,对于其它边边角角的内容不多阐述。二、步骤spring boot配置文件:logging: level: com.my.dynamicdatasourc...

2020-04-07 23:05:52 2118

原创 Quartz快速入门

一、Quartz简介1.quartz是开源且具有丰富特性的"任务调度库",能够集成于任何的java应用。2.quartz主要分为三大组件,分别是任务Job、触发器Trigger以及调度器Scheduler。quartz体系架构图:二、quartz三大组件简介1.任务Job:即想要调用的任务类,需要实现org.quartz.job接口,并重写execute()方法,任务...

2020-03-12 14:10:57 831 1

原创 Mybatis从入门到精通——分页插件pagehelper的使用(20)

一、pagehelper分页插件pagehelper是一个开源的基于Mybatis拦截器开发的通用分页插件工具,一般项目中也是使用这个。具体的项目地址:https://github.com/pagehelper/Mybatis-PageHelper具体的使用说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/R...

2020-03-09 21:09:11 430

原创 Mybatis从入门到精通——插件和拦截器的使用(19)

一、Mybatis插件和拦截器的使用在Mybatis中,插件是通过实现拦截器接口进行拦截操作而完成的,也就是说插件是基于Mybatis拦截器的,Mybatis中拦截器的接口为Interceptor,该拦截器能够对Mybatis内部运行的四大接口的方法进行拦截,四大接口分别为:Executor、StatementHandler、ResultSetHandler、ParameterHandler。...

2020-03-09 20:49:47 579 2

原创 Mybatis从入门到精通——TypeHandler的使用(18)

一、TypeHandlerTypeHandler是Mybatis提供的一个JdcbType和JavaType之间互相转换的处理器,用于在传参和返回值设置时进行转换,使用在result、id这类返回值映射标签上,一般不需要进行转换,因为Mybatis已经提供了足够多且常用的TypeHandler。二、案例案例说明:对于枚举的转换,Mybatis是没有提供的,我们需要把数据库中s...

2020-03-09 18:08:51 664

原创 Mybatis从入门到精通——返回Map处理(17)

一、返回Map处理在Mybatis中,支持返回值为Map<K,V>的操作,如果需要返回值为Map时,在Mapper接口的该方法上添加@MapKey(value="属性名")注解,则会把结果集按照Map返回,并且key为@MapKey上设置的属性。二、案例mapper映射文件:<?xml version="1.0" encoding="UTF-8"?>...

2020-03-09 17:28:47 443

原创 Mybatis从入门到精通——二级缓存和一级缓存(16)

一、一级缓存和二级缓存程序中缓存对系统效率的提升是极大的,在Mybatis中,缓存分别为一级缓存和二级缓存,其中一级缓存是默认开启的,二级缓存需要手动开启。二、一级缓存说明:1.Mybatis的一级缓存是默认开启的。2.若要停止Mybatis的一级缓存可以通过设置select标签上的flushCache属性为true,会每一次执行完查询就情况一级缓存。3.一级缓存的生...

2020-03-09 17:05:35 193

原创 Mybatis从入门到精通——鉴别器使用(16)

一、鉴别器Mybatis的鉴别器(discriminator)是ResultMap的子标签,它提供了可以根据不同结果信息执行不同查询操作,只能用于分步查询中。二、使用说明1.查询结果集:<resultMap id="testResultMap" type="xxx" extends="xxx"> <id property="" column="" /&g...

2020-03-09 16:21:05 949

原创 Mybatis从入门到精通——分步查询(14)

一、分步查询在使用到多表关联查询时,经常会碰到多对多,一对多和一对一的级联操作,在Mybatis中通过resultMap标签下的association和collection解决级联操作的问题。级联操作分为:关联查询和分步关联查询,本文介绍分步查询,如需学习关联查询,请看上一篇博客。二、表关系说明user表结构和数据:DROP TABLE IF EXISTS `user`;C...

2020-03-09 15:09:13 574

原创 Mybatis从入门到精通——MGB代码生成器(12)

一、MGB(MyBatis Generator)代码生成器在Mybatis中,对于单表操作,其实都是一个类似的重复操作,Mybatis提供了代码生成器,用于生成Mybatis的mapper接口和mapper.xml文件以及对应的实体类。二、使用教程1.添加插件到maven <plugin> ...

2020-03-09 11:41:19 650

原创 Mybatis从入门到精通——批量操作(11)

一、批量操作在某些场景下需要进行批量操作,如批量插入多少条数据等,在Mybatis中共有两种方式进行批量操作,第一种是使用foreach标签一次性插入多条;第二种是使用BATCH执行器,每次提交一条,到达一定数量后手动一次性提交。二、foreach批量操作mapper文件: <insert id="insertPersonList" > i...

2020-03-09 11:39:54 204

原创 Mybatis从入门到精通——关联查询(13)

一、一步关联查询在使用到多表关联查询时,经常会碰到多对多,一对多和一对一的级联操作,在Mybatis中通过resultMap标签下的association和collection解决级联操作的问题。关联查询分为:一步关联查询和分步关联查询,本文介绍一步关联查询,如需学习分步关联查询,请看下一篇博客。二、表关系说明user表结构和数据:DROP TABLE IF EXIST...

2020-03-09 11:38:50 382

原创 Mybatis从入门到精通——动态SQL标签(10)

一、动态sql标签作用动态SQL标签是Mybatis的一大特色,通过使用动态SQL标签可以完成一些稍微复杂的操作和简化开发。动态SQL标签主要包括:if、where、set、trim、choose-when-otherwise、foreach,下面将对每个标签进行说明。二、where标签说明:where标签一般和if标签搭配使用,用于sql中存在多余字符and或or的问题,当...

2020-03-08 19:54:25 336

原创 Mybatis从入门到精通——sql标签(9)

一、sql标签作用该标签是用来定义一些可复用的sql语句,需要在使用该复用sql语句的地方通过include标签引用。二、准备工作1.maven依赖 <dependencies> <!-- mysql驱动 --> <dependency> <groupId&g...

2020-03-08 17:32:35 541

原创 Mybatis从入门到精通——selectKey标签(8)

一、selectKey标签作用该标签是用来定义insert、update中主键生成的策略,在执行insert或update操作的之前或之后生成自定义主键。二、selectKey标签属性序号 属性名 说明 1 resultType 该查询返回主键的类型(一般是Integer或String) 2 keyProperty...

2020-03-08 17:14:00 2000

原创 Mybatis从入门到精通——update、insert、delete标签(7)

一、update标签属性说明序号 属性名 说明 1 id 和mapper的命名空间结合后应该是唯一的,所以不能有重载的方法。 2 parameterType 传入的参数类型,可以写全类名或者写Mybatis提供的别名(一般我们能想到的别名都有),自定义的类,如果定义了别名可以使用别名。...

2020-03-08 16:50:16 731

原创 Mybatis从入门到精通——select标签(6)

1.select标签属性序号 属性名 说明 1 id 和mapper的命名空间结合后应该是唯一的,所以不能有重载的方法。 2 parameterType 传入的参数类型,可以写全类名或者写Mybatis提供的别名(一般我们能想到的别名都有),自定义的类,如果定义了别名可以使用别名。 ...

2020-03-08 16:38:51 283

原创 Mybatis从入门到精通——参数传递(5)

一、准备工作1.maven依赖 <dependencies> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec...

2020-03-08 14:16:51 209

原创 Mybatis从入门到精通——配置文件和映射文件说明(4)

一、mybatis-config配置说明mybatis-config的configuration标签下的常用子标签说明序号 标签名 说明 1 properties 引入外部配置文件,可以通过${}表达式引用 2 settings 设置Mybatis的全局配置属性,它能改变Mybatis运行时行为 3 type...

2020-03-08 13:23:43 207

原创 Mybatis从入门到精通——Mybatis快速使用(3)

一、准备工作1.maven依赖 <dependencies> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec...

2020-03-08 12:31:48 167

原创 Mybatis从入门到精通——JDBC使用回顾(2)

一、简要说明不管是Mybatis还是Hibernate都是对JDBC的二次封装,在使用JDBC之前,我们先回顾一下JDBC的使用。二、准备工作1.maven依赖 <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId...

2020-03-08 12:02:35 183

原创 Mybatis从入门到精通——简介(1)

一、ORM框架Object Relational Mapping:对象关系映射,是一种为了解决面向对象与关系型数据库存在不匹配现象的技术,简单说,orm通过描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。目前java开发中常用的ORM框架为半自动化的Mybatis和全自动的Hibernate。二、Mybatis和Hibernate对比对比信息如下图...

2020-03-08 11:31:22 261

原创 并发编程之——Java内存模式和volatile详解

一、定义Java内存模型(Java Memory Model,JMM):由Java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性,即屏蔽掉了底层不同计算机的区别。二、缓存一致性缓存是用来解决CPU执行速率和内存(RAM)数据处理速率不一致而产生的,即CPU执行的速度远超内存...

2020-02-02 20:50:26 1646

原创 并发编程之——线程基础

一、线程的开启方式1.继承Threadpublic class UserThread extends Thread { @Override public void run() { System.out.println("通过继承Thread类开启新线程!"); }}2.实现Runnable接口public class UseRunna...

2020-01-19 13:09:01 2870

原创 设计模式之——责任链模式

一、基本介绍责任链模式(行为型):为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。二、包含角色1.抽象处理者角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。2.具体处理者角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处...

2020-01-12 21:16:57 1264

空空如也

空空如也

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

TA关注的人

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