自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

u010502101的博客

成长中的菜鸟程序员

  • 博客(359)
  • 资源 (4)
  • 收藏
  • 关注

原创 5.11 mybatis之returnInstanceForEmptyRow作用

mybatis的settings配置中有个属性returnInstanceForEmptyRow,该属性新增于mybatis的3.4.2版本,低于此版本不可用。该属性的作用官方解释为:当返回行的所有列都是空时,MyBatis默认返回 null。当开启这个设置时,MyBatis会返回一个空实例。请注意,它也适用于嵌套的结果集(如集合或关联)。该属性默认配置为false。如何理解上面这句话?

2024-04-18 00:10:39 816

原创 5.10 mybatis之useActualParamName作用

useActualParamName官方解释:允许使用方法签名中的名称作为语句参数名称。为了使用该特性,你的项目必须采用 Java 8编译,并且加上 -parameters 选项。(新增于3.4.1)。useActualParamName有2个值,true和false,如不配置默认为true。如何理解这句话呢?

2024-04-16 23:20:20 318

原创 5.9 mybatis之callSettersOnNulls作用

在mybatis的settings配置参数中有个callSettersOnNulls参数,官方解释为:指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。什么意思呢?我们先看下面一段解释,不理解没关系,等看完下面的代码示例后再回来看一定会理解。

2024-04-14 23:05:11 1117

原创 5.1 mybatis配置文件之properties配置

在章节中分析了mybatis解析properties的源码,通过源码可以发现properties支持3种用法。

2024-04-11 16:46:21 540

原创 5.2 mybatis之autoMappingBehavior作用

众所周知mybatis中标签< resultMap >是用来处理数据库库字段与java对象属性映射的。通常java对象属性(驼峰格式)与数据库表字段(下划线形式)是一 一对应的情况下,是不用定义< resultMap >标签的,是因为数据库表字段会自动映射到java对象的对应属性上的,比如数据库表一个字段为USER_NAME,java对象对应的属性为userName,默认情况下会自动映射的。数据库表字段为什么会和java对象属性自动映射的?什么情况下会自动映射?什么情况下不会自动映射?

2024-04-11 16:45:31 946

原创 5.3 mybatis之autoMappingUnknownColumnBehavior作用

autoMappingUnknownColumnBehavior是< settings >配置下的属性,该属性是指定发现自动映射目标未知列(或未知属性类型)的行为。就是说当数据库中的字段找不到映射java对象的属性或者与java对象对应属性的类型不匹配时会产生什么样的行为。autoMappingUnknownColumnBehavior属性可以指定当映射失败时会产生三种行为,默认情况配置的是NONE下面分别看下三种情况。

2024-04-11 16:44:55 1105

原创 5.5 mybatis之useGeneratedKeys作用

官方解释 useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。其实就是useGeneratedKeys参数控制用数据库自增的主键作为数据库插入的主键,并且在应用中可以获取自增的主键。useGeneratedKeys有2个取值:true和false。取值true时表示开启支持自动生成主键;

2024-04-11 16:42:56 592

原创 5.8 mybatis之EnumTypeHandler详细使用

在 Java 中,枚举类型是一种特殊的类,当我们在数据库和 Java 对象之间进行映射时,通常需要将数据库中的某个字段(如字符串或数字)映射到 Java 枚举类型上,或者更新插入数据库时,需要把java的枚举类型映射到数据库字段上,这就需要一种机制来在两者之间建立映射关系。EnumTypeHandler 就是这样一个机制,它能够帮助我们完成这一任务。

2024-04-11 00:19:41 444

原创 5.7 mybatis之ResultHandler流式处理数据

Mybatis 中的 ResultHandler 相当于数据结果集的处理器,它是一个回调函数(Callback),用来处理每一行数据的结果,这个回调函数可以在查询结果处理到一定量时触发,对结果集数据进行定制化处理。ResultHandler 的使用可以大幅提升数据处理的效率,当我们需要处理大量的数据时,一般会使用 ResultHandler 来进行结果的处理,避免一次查询就全部返回结果,浪费内存资源或造成 OOM。我们要查询persion_id大于多少的数据,对应的mapper文件如下所示。

2024-04-10 00:18:53 405

原创 5.4 mybatis之lazyLoadingEnabled、aggressiveLazyLoading和lazyLoadTriggerMethods延迟加载配置

mybatis配置文件中*< settinds >* 配置下的lazyLoadingEnabled表示延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态(此句话具体什么意思,我们稍后再讲)。上面是官方文档中介绍,什么意思呢,当lazyLoadingEnabled=true时,开启了全局延迟加载的开关,当SQL关联查询时,对应的关联对象会被延迟加载,只有当用的时候才会真正的加载。lazyLoadingEnabled有两个取值,

2024-04-09 23:02:21 1467 1

原创 5.6 mybatis之RowBounds分页用法

但是底层SQL查询的时候还是从第1条开始查,然后从查询结果中过滤掉第1条数据,所以SQL性能也比较慢,因为查询查询量比较大。但是由于它是在 sql 查询出所有结果的基础上截取数据的,所以在数据量大的sql中并不适用,它更适合在返回数据结果较少的查询中使用。由于 java 允许的最大整数为 2147483647,所以 limit 能使用的最大整数也是 2147483647,一次性取出大量数据可能引起内存溢出,所以在大数据查询场合慎重使用。对应的mapper文件如下所示。假设数据库表如下所示。

2024-04-09 00:00:54 480

原创 4.二级缓存解析

二级缓存也称作是应用级缓存,与一级缓存不同的,是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改较少的数据。在流程上是先访问二级缓存,在访问一级缓存。

2023-01-16 19:06:56 3875 1

原创 3. 一级缓存解析

在上一篇基础上,我们继续看下一级缓存相关内容本节内容主要分析一级缓存,首先看一下一级缓存命中的条件有哪些。

2022-11-27 23:51:27 2499

原创 2. Executor与SqlSession解析

基本功能:改、查,没有增删的原因是,所有的增删操作都可以归结到改;缓存维护:这里的缓存主要是为一级缓存服务,功能包括创建缓存Key、清理缓存、判断缓存是否存在;事物管理:提交、回滚、关闭、批处理刷新。下面看下执行器的上下继承关系共包括3中Executor执行器,分别为SimpleExecutor、ReuseExecutor、BatchExecutor,其中BaseExecutor是封装了获取链接、维护事物、以及一级缓存相关的通用操作,三种执行器都是继承BaseExecutor而来。

2022-11-14 19:10:46 2702

原创 1. Springboot集成Mybatis

在深入理解mybatis源码之前,首先搭建mybatis的测试环境用于跟踪代码测试用。下面介绍两种springboot集成mybatis运行环境的案例。一种是通过springboot包装mybatis的构建过程,一种是自行构建Mybatis的执行环境。以查询user表为例,数据如下。

2022-11-02 23:12:02 2696

原创 10. RabbitMq 集群搭建

在本系列中介绍了搭建RabbitMq环境的过程,现在要搭建含有3台RabbitMq服务器的集群环境。,如下所示,修改成喜欢的IP即可只需修改文件中的IPADDR即可。3台服务器的hostname分别设置为node1、node2、node3比如以第一台为例,通过直接编辑hostname文件内容为node1即可,另外2台同样设置。修改方式,分别在各个节点执行,在hosts文件中追加下面内容在node1上执行下面2条命令,把node1节点上的cookie文件复制到node2和node3上。

2022-09-28 00:51:58 4338 1

原创 9. RabbitMq之优先级队列与惰性队列

默认情况下,生产者发布消息到RabbitMQ队列时,队列中的消息都是存储到内存中的,因此消费者消费消息时才可以快速的进行消费。即使对于持久化的消息,消息在持久化到磁盘中的同时也会在内存中保留一份,消费者消费消息时才可以进行快速的修复,但对于持久化的消息,RabbitMq需要释放内存的时候,会将内存中的消息换页至磁盘中,该操作耗时较长,会阻塞队列的操作,从而无法接收生产者的消息,虽然RabbitMq开发者们一直在研究相关算法,但效果不太理想,尤其是当消息量非常大的时候。创建优先级队列时,需要指定。...

2022-08-26 00:20:57 746

原创 8. springboot + rabbitmq 消息发布确认机制

在章节已经介绍了rabbitmq生产者是如何对消息进行发布确认保证消息不丢失的。本章节继续看下springboot整合rabbitmq后是如何保证消息不丢失的。

2022-08-05 10:05:29 3233

原创 7. RabbitMQ之延时队列

延迟队列是通过TTL实现的,TTL指Time To Live,消息存活时间,TTL是RabbitMQ中消息或者队列的属性,表明可以设置一条消息或者队列中所有消息的存活时间。可以对一条消息设置TTL,表示这条消息的存活时间;也可以对队列设置TTL,表示队列中所有消息的存活时间都是一致的。如果某条消息被设置了TTL,或者队列被设置了TTL属性,那么在TTL时间内这些消息没有被消费的话就会变成死信消息,被投递到死信队列中。在上一篇文章中已经介绍了2种设置TTL的方式:一种就是为队列设置参数,使队列中所有消息有相同

2022-07-21 01:27:48 1019

原创 6 RabbitMQ之死信队列

造成消息死信的原因主要有以下3点:下面通过代码演示三种原因下死信队列的处理,如下图所示,首先生产者生产消息投递到normal_exchange交换机,然后路由到normal_queue中,队列中消息可以被Consumer1正常消费的消息会从队列中删除掉,但由于上述三种原因导致消息不能正常被消费的消息就会被重新投递到dead_exchange死信交换机,然后被路由到dead_queue死信队列中,最后死信消息被Consumer2处理。首先创建一个Consumer1消费者类,Consumer1类中创建了一个n

2022-07-01 01:27:17 1043

原创 5. RabbitMQ之交换机

交换机其实是一种routingKey,或者叫路由key,生产者生产的消息根据指定的key路由到指定的队列中。无名交换机其实也是一种direct交换机,在之前几篇文章中发布消息时一直采用下面的形式,第一个参数就表示无名交换机,也就是如果不送交换机默认采用的交换机。从RabbitMQ管理端可以看无名交换机如下所示就是说凡是生产者生产的消息没有指定交换机时,都会通过默认的交换机把消息投递到QUEUE_NAME队列中。Binding其实就是绑定exchange交换机与队列的关系,用来指明交换机绑定了哪个或哪些

2022-06-17 00:44:46 857 1

原创 4. RabbitMQ之生产者发布确认原理

文章目录1. 队列持久化2. 消息持久化3. 发布确认3.1 发布确认原理3.2 消息单个确认发布3.3 消息批量确认发布3.4 消息异步确认发布在进行生产者发布确认之前先看下队列和消息持久化问题。1. 队列持久化队列持久化指将创建的队列持久化到磁盘中。如果创建的队列是非持久化的,当RabbitMQ服务重启后,非持久化的队列将会被删除掉,导致消息丢失。设置队列为持久化方式很简单,只需在调queueDeclare方法声明一个队列时指定durable参数为持久化即可,下面会具体用到。如果之前已经创建的

2022-06-03 23:32:57 548

原创 3. RabbitMQ之消息应答机制

文章目录1. 自动应答2. 手动应答消息应答机制为RabbitMQ服务器向消费者传递了一个消息后,消费者给服务器的一个回复,服务器接到答复后决定是否删除这个已经消费的消息。RabbitMQ的消息应答机制分为自动应答和手动应答两种形式。1. 自动应答RabbitMQ服务器一旦把消息传输给消费者后,服务器就默认为消息已经传送成功,服务器队列中便自动删除该消息。自动应答机制虽然传输方面的吞吐量比较高,但是这种机制存在严重的弊端。一方面如果消费者程序出现bug,或者消费者端链接或者channel已关闭导致消

2022-05-25 01:21:38 1183 2

原创 2. RabbitMQ之Work Queues

文章目录1. Work Quesues概述2. Work Queues案例1. Work Quesues概述work queues是工作队列,又叫任务队列,是为了解决多个消费者有序执行密集型的资源任务。比如以下图为例,生产者产生大量消息发给了消息队列中,但是消息消费时比较耗时,这种情况下可以创建多个消费者同时进行消费,但一定要保证一个消息只能被一个消费者进行消费,假如一个消息被Consumer1消费了就不能再被Consumer2或者Consumer3再消费,所以queue队列中消息就像有序的被消费,qu

2022-05-21 16:59:35 846

原创 1. RabbitMQ之Hello World

文章目录1. 消息队列作用2. 消息队列分类3. RabbitMQ工作原理4. RabbitMQ服务器安装5. HelloWorld程序RabbitMQ消息队列本质上是一个先进先出的队列。1. 消息队列作用1. 流量消峰举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时

2022-05-20 19:44:52 535

原创 1.2 类的加载器

文章目录1. 双亲委派机制原理2 双亲委派的优势与弊端3 违反双亲委派机制的行为3.1 第一种违反双亲委派机制行为3.2 第二种违反双亲委派机制行为4. 沙箱机制5. 自定义类加载器在上篇文章中介绍了类的加载器以及加载过程,下面继续进一步理解类的加载器。1. 双亲委派机制原理双亲委派机制原理:如果一个类加载器收到了类加载的请求,该类加载器并不会立即去加载,而是把加载任务先委托给父加载器加载;如果父加载器还有父加载器,则会继续向上委托,一直委托到启动类加载器;如果父加载器可以完成加载Class字节码的任

2022-03-02 23:58:58 436

原创 8.7 JVM命令行监控之——jcmd

文章目录1. 描述2. 用法2.1 查看java进程2.2 查看jcmd有哪些command命令2.3 查看虚拟机启动了多长时间2.4 打印栈信息2.5 查看类的统计信息2.6 导出堆dump文件2.7 获取系统的properties属性2.8 获取JVM的启动参数1. 描述jcmd即jvm command,该命令行工具的功能几乎涵盖了前面几节介绍的所有命令行工具的功能,它可以用来导出堆、查看堆栈使用情况、查看java进程、导出线程信息、查看GC运行情况。2. 用法命令:jcmd pid help

2021-11-13 00:37:10 774

原创 8.6 JVM监控之——jstack

文章目录1. 描述1. 描述jstack全名为jvm stack trace,java堆栈跟踪工具,该工具用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有相应的线程到底在后台做些什么事情,或者等待什么资源。public class JstackDe

2021-11-10 14:11:08 741

原创 8.5 JVM命令行监控——jmap

文章目录1. jmap描述2. jmap用法2.1 导出dump文件2.2 输出堆内存信息2.2.1 输出堆空间使用信息2.2.2 输出对象统计信息1. jmap描述jmap全称jvm memory map,该命令有两个作用:第一个是可以获取堆dump文件,dump文件是堆转储快照的二进制文件文件;第二还可以获取堆的使用情况、堆中对象统计信息以及类加载信息等。2. jmap用法2.1 导出dump文件命令:jmap -dump:format=b, file=文件名 pid 或者 jmap -dum

2021-11-09 00:29:29 870

原创 8.4 查看JVM所有系统参数

文章目录1. 查看所有JVM参数启动的初始值2. 查看所有被用户或者JVM修改过的参数的值3. 查看所有JVM参数的最终值1. 查看所有JVM参数启动的初始值命令:java -XX:+PrintFlagsInitial此地应有截图。。。2. 查看所有被用户或者JVM修改过的参数的值命令:java -XX:+PrintCommandLineFlags此地应有截图。。。3. 查看所有JVM参数的最终值如果JVM的参数的初始值被修改过就显示修改过的值,如果没被修改过就显示初始的值,命令:java

2021-11-08 15:54:29 488

原创 8.3 JVM命令行监控——jinfo

文章目录1. jinfo描述1. jinfo描述jinfo(Configuration Info for Java) 的作用是实时查看和调整虚拟机各项参数。jinfo与jps -v的区别:使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表, 但如果想知道未被显式指定的参数的系统默认值,则需要通过jinfo命令。...

2021-11-08 01:45:27 467

原创 8.2 JVM命令行监控——jstat

文章目录1. jstat介绍2. jstat用法2.1 案例一2.2 案例二2.3 案例三2.4 案例四1. jstat介绍jstat全名JVM statistics monitoring tool,用于监视虚拟机各种运行状态信息的命令工具,它可以显示本地或者远程虚拟机进程中类的装载、内存、垃圾收集、JIT编译运行等运行时数据。2. jstat用法命令:jstat -<option> [-t] [-h<lines>] <vmid> [<interval&gt

2021-11-05 00:47:07 419

原创 8.1 JVM命令行监控——jps

文章目录1. jps介绍2. jps用法2.1 jps -q2.2 jps -l2.3 jps -m2.4 jps -v1. jps介绍jps全称java process status,用于查看Hotspot虚拟机中正在执行的进程。2. jps用法jps [-q][-mlvV] [hostid]2.1 jps -qjps -q之显示进程id。2.2 jps -ljps -l输出执行进程程序的全类名或者如果执行的是jar包,输出jar的完成路径。2.3 jps -mjps -m输出虚拟机

2021-10-27 00:30:26 806

原创 7. 字节码指令详解

文章目录1 加载与存储指令1.1 加载1.2 存储字节码指令一般包括两种形式:一种是只有一个操作符1 加载与存储指令加载指的是从栈帧中的局部变量表中加载数据到栈帧中的操作数栈中,存储与加载正好反过来,指的是把操作数栈中的数据存储到局部变量表中。关于局部变量表和操作数栈的理解可以参考JVM的运行时数据区。1.1 加载加载又包括两种加载,第一:从局部变量表中加载数据到操作数栈中;第二种:直接把常量加载到操作数栈中。1. 从局部变量表中加载数据到操作数栈中从局部变量表中加载数据到操作数栈中主要包括

2021-10-15 10:12:59 1682

原创 5. JVM垃圾回收

文章目录1. 什么是垃圾对象2. 引用计数算法3. 可达性分析算法1. 什么是垃圾对象垃圾对象(Garbage Object)指程序运行中没有任何指针指向的对象,这种对象就是要被回收的对象。如果不及时对这些垃圾对象回收,这些对象占据内存空间,容易导致内存溢出。对于内存中的对象,首先在标记阶段被标记为了垃圾对象,在清除阶段才会被清除。区分内存中哪些是存活对象,哪些是垃圾对象的阶段即为垃圾标记阶段。垃圾标记阶段判断兑现是否存活有两种方式:引用计数算法和可达性分析算法。2. 引用计数算法引用计数算法(R

2021-09-22 23:54:43 476 1

原创 java中对象引用

文章目录1. 强引用2. 软引用(SoftReference)3. 弱引用(WeakReference)4. 虚引用(PhantomReference)5. 总结java中对象引用分为强、软、若、虚4中引用,其中强引用就是普通的new一个对象,软引用、弱引用、虚引用都是继承自抽象类Reference。1. 强引用程序代码中最常见的引用,比如Persion persion = new Persion(),无论任何情况下,只要强引用关系还在,强引用的对象是可触及的,垃圾回收器就不会回收掉被引用的对象。如

2021-09-06 01:52:31 812

原创 垃圾回收中的安全点与安全区域

文章目录1. 垃圾回收中的安全点2. 垃圾回收中的安全区域1. 垃圾回收中的安全点安全点:程序执行过程中需要进行垃圾回收时,只有在特定的位置停顿下来开始进行GC,这些特定位置称之为安全点(Safepoint)。Safepoint的选择很重要,如果太少可能导致GC等待用户线程执行的时间太长;如果太多,就是太频繁的执行GC,影响性能。大部分指令执行时间都非常短,通常会根据是否具有让程序长时间执行的特征为标准,比如选择一些执行时间较长的指令作为saftpoint,如方法调用、循环跳转和异常跳转等。当多个

2021-09-02 00:38:16 1598 2

原创 并发与并行

文章目录1. 操作系统中的并发与并行2. 垃圾回收的并发与并行并发还是并行在不同的场景下是不同的,下面分别就操作系统中和JVM垃圾回收器中的差别介绍如下1. 操作系统中的并发与并行并发:操作系统中并发并行与应用程序中的并发并行是一个意思。并发指在一个时间段内,一个处理器中有多个程序同时在运行。并发并不是真正意义上的同时进行,只是CPU把一个时间段划分成几个时间片段,然后CPU在这几个时间片段之间来回切换,由于CPU处理时间非常快,只要时间间隔处理得当,可以让用户感觉多个应用程序同时在运行。这里CP

2021-09-01 00:54:12 174

原创 JVM之内存溢出与内存泄漏

文章目录1 内存溢出2 内存泄漏(Memory Leak)1 内存溢出内存溢出(OutOfMemoryError)就是JVM中没有空闲内存,垃圾回收器回收垃圾之后也无法提供足够的内存,导致内存溢出。内存溢出一般由两方面导致:虚拟机的堆内存设置太小;内存中创建了很多大对象,垃圾回收器之后也不能回收足够的内存空间。在发生OOM之前一般都会进行垃圾回收,如果能回收足够的内存空间就不会出现OOM异常;如果垃圾回收之后也不能回收足够空间,此时就会发生OOM。但是不是任何情况下,OOM之前都会触发垃圾回收,比如

2021-08-31 00:35:22 1313

原创 System.gc()

文章目录System.gc()等同于Runtime.getRuntime().gc(),因为System.gc()底层就是调用Runtime.getRuntime().gc()实现的。通过显示的调用System.gc(),表示显示的触发FULL GC,同时对新生代和老年代进行垃圾回收,但是调用System.gc()无法保证JVM立即进行垃圾回收。JVM的垃圾回收是自动进行的,无须手动触发。System.gc()与System.runFinalization()区别:前面已经介绍,System.gc

2021-08-30 00:38:34 2142

helm-tiller.tar

由于谷歌被强,无法下载谷歌镜像,特此提供Helm的服务器端Tiller的镜像,该镜像可以在k8s中用于创建pod

2020-11-19

kubeadm-basic.images.tar.gz

安装kubeadm时,需要登录到google才能下载google镜像,由于国内不能登录google,所以上传google的镜像

2020-06-10

android入门教程

对于没了解过android开发的同学非常适合。

2015-10-04

STC的详细介绍

该文档400多页,全面细致的介绍了STC单片机,是新手学习的好资料,也是技术人员备用查阅的好资料。档

2013-10-07

空空如也

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

TA关注的人

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