自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot使用Zxing生成二维码

ZXing,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他语言的端口。另外还可以使用一些其他的方式生成二维码,比如基于开源的Hutool工具生成二维码,可以参考SpringBoot系列(22):Java生成二维码的几种实现方式(基于Spring Boot)

2024-04-09 16:19:28 463

原创 计算当前是第几周

【代码】计算当前是第几周。

2024-04-09 15:40:32 251

原创 springboot+websocket+微信小程序实现评论区功能

Springboot+websocket+微信小程序实现评论区的功能

2024-04-07 22:32:45 880 2

转载 mybatis-plus 使用wrapper and和or连用,A and (B or C)

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了QueryWrapper自定义查询对象,可以无需手写sql,进行条件查询。在其中的and()和or()方法,可以进行条件的连接,写几个例子介绍一下使用方式;

2023-11-20 17:56:14 3130

原创 Springboot项目报错Invalid bound statement (not found):com.uyun.bankbranchalert.mapper.ReporterStatusMapp

【代码】Springboot项目报错Invalid bound statement (not found):com.uyun.bankbranchalert.mapper.ReporterStatusMapp。

2023-11-15 16:55:28 100

原创 springboot项目报错Cannot deserialize value of type `java.sql.Timestamp` from String “2023-11-13 15:39:21

主要是后台到前台的时间格式的转换。主要是前台到后台的时间格式的转换。

2023-11-15 16:35:02 511

原创 Springboot项目中打印日志

logging: level: com.uyun.bankbranchalert.mapper: debug root:info

2023-11-15 15:44:32 221

原创 idea 将分支的代码合并到master

(自己的分支是自己写的代码,需要合并到master分支去)

2023-11-06 10:43:33 907

原创 InnoDB存储引擎中锁的范围

当一个事务获取了某一行的共享锁之后,其他事务可以继续获取该行的共享锁,但是不能获取排它锁。通过锁定范围内的间隙,间隙锁可以保证其他事务无法在范围内插入新的记录,从而避免了幻读问题的发生。是的,记录锁( Lock)是对数据库中的单行记录进行锁定的机制。当一个事务获取了某一行的排它锁之后,其他事务就无法获取该行的排它锁或共享锁,直到持有排它锁的事务释放锁。需要注意的是,间隙锁只会在某个范围内的间隙上加锁,而不会锁定具体的记录,其他事务仍然可以在范围内的间隙之外插入新的记录。

2023-09-09 22:08:31 262

原创 java解决 衣服尺码 Compare T-Shirt Sizes

一般来说衣服尺码分为L,M,S三种,分别代表大(Large),中(Medium)和小(Small)。不过由于人的身高差异性较大,尺码又会进行细分,会在L和S前面加上一个或多个X表示更大或更小的尺码。例如,XS比S小一个尺寸,XXS比XS小一个尺寸,而XL比L大一个尺寸,XXL比XL大一个尺寸,依此类推。有时候为了简化,当尺码前面有大于或等于两个X时,会简写为“X的个数+XL或XS”的形式,例如XXXL会简写为3XL,XXXXS会简写为4XS。接下来T行,每一行输入两个由空格隔开的字符串,分别表示尺码。

2023-09-07 22:20:37 397

原创 Java 线程池

简单理解,它就是一个管理线程的池子。它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。提高响应速度。如果任务到达了,相对于从线程池拿线程,重新去创建一条线程执行,速度肯定慢很多。重复利用。线程用完,再放回池子,可以达到重复利用的效果,节省资源。

2023-09-06 16:39:18 469

原创 线程的6种状态

方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而。状态相当于在等待状态的基础上增加了超时限制,比如通过。线程在执行 Runnable 的。

2023-09-06 16:30:56 131

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

Spring 循环依赖:简单说就是自己依赖自己,或者和别的 Bean 相互依赖。只有单例的 Bean 才存在循环依赖的情况,原型(Prototype)情况下,Spring 会直接抛出异常。原因很简单,AB 循环依赖,A 实例化的时候,发现依赖 B,创建 B 实例,创建 B 的时候发现需要 A,创建 A1 实例……无限套娃,直接把系统干垮。Spring 可以解决哪些情况的循环依赖?Spring 不支持基于构造器注入的循环依赖,但是假如 AB 循环依赖,如果一个是构造器注入,一个是 setter 注入呢?

2023-09-05 16:17:11 698

原创 进程,线程,协程

字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。需要注意的是,如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。所以,程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。

2023-09-03 14:55:57 312

原创 请求转发和重定向

客户端的行为,地址栏发生改变,有两个请求,重定向可以转发到任意地址(可以跨越),request中的数据不共享。服务端的行为,地址栏不会发生改变,只有一个请求,request当中的数据在servlet程序中共享。转发的地址只能是网站内的资源,不能转到百度等页面。不能重定向到WEB-INF中的页面。可以重定向到百度等页面。

2023-09-03 14:33:51 135

原创 死锁 && 银行家算法

银行家算法的核心是安全性检测子算法,这个子算法实际上就是个寻找安全序列的过程,如果能够找到一个安全的给进程分配资源的序列,就认为是安全的。在资源的动态分配过程中,使用某种方法防止系统进入不安全状态,从而避免死锁的发生。进程想要向操作系统申请资源,操作系统查看自己是否有足够的资源,若自己有足够的资源就分配给进程。(4)系统执行安全性检查,若此次分配资源后系统处于安全状态,就正式分配资源给进程P。(2)如果request>Max,表示操作系统没有足够的资源分配,让该进程继续等待。

2023-09-01 20:51:52 219

原创 Java 创建一个线程的方式

上面两种都是没有返回值的,但是如果我们需要获取线程的执行结果,该怎么办呢?Java中创建线程主要有三种方式,分别为。

2023-09-01 20:48:53 308

原创 java设计模式---策略模式

策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。如果在一个系统里面有许多类,它们仅仅在行为上有区别,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种;如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

2023-08-31 15:33:02 692

原创 单元测试及其工具Junit

下载完以后解压到你喜欢的目录下,假设是JUNIT_HOME,然后将JUNIT_HOME下的junit.jar包加到你的系统的CLASSPATH环境变量中,对于IDE环境,对于需要用到的junit的项目增加到lib中,其设置不同的IDE有不同的设置,这里不多讲。单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。线上错误的发现,排查问题,修复,测试环境验证到上线的周期一般半天起步。

2023-08-30 17:24:05 2644

原创 版本控制 Git工具的使用

没有进行版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,比如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题。当在一个分支中已经存在的文件在另一个分支中被修改并提交,原分支中的文件再次修改为不同的内容提交,而后将其中一个分支合并到另一个分支的时候就会发生合并冲突:此时我们需要手动修改冲突。当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

2023-08-30 17:16:57 890

原创 JVM ZGC垃圾收集器

ZGC的染色指针技术将46位指针宽度的高4位取出来存储4个标志信息,通过这些标志位,虚拟机可以直接从指针中看到其引用对象的三色标记状态、是否进入了重分配集(即被移动过)、是否只能通过finalize()方法才能被访问到,如图3-20所示。是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。大型Region(Large Region):容量不固定,可以动态变化,但必须为2MB的整数倍,用于放置。

2023-08-30 14:10:33 792

原创 JVM 垃圾收集器

CMS作为老年代的收集器,却无法与JDK 1.4.0中已经存在的新生代收集器Parallel Scavenge配合工作[1],所以在JDK 5中使用CMS来收集老年代的时候,新生代只能选择ParNew或者Serial收集器中的一个。和 ParNew 有些类似,但 Parallel Scavenge 主要关注的是垃圾收集的吞吐量——所谓吞吐量,就是 CPU 用于运行用户代码的时间和总消耗时间的比值,比值越大,说明垃圾收集的占比越小。主要垃圾收集器如下,图中标出了它们的工作区域、垃圾收集算法,以及配合关系。

2023-08-29 22:41:23 693

原创 JVM 访问对象的两种方式

由于 reference 类型在《Java 虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用。这两种对象访问方式各有优势,使用句柄来访问的最大好处就是 reference 中存储的是稳定句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference 本身不需要被修改。HotSpot 虚拟机主要使用直接指针来进行对象访问。

2023-08-28 21:35:45 1597

原创 JVM 给对象分配内存空间

如果堆的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。堆的内存是绝对规整的,内存主要分为两部分,所有使用过的内存被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,分配空间的时候,仅仅把指针向空闲方向挪动一段与对象大小相等的距离。实现简单,多线程下,效率不高,CAS+失败重试的形式完成的。

2023-08-28 21:27:00 820

原创 JVM 判定对象是否死亡的两种方式

这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数,局部变量,临时变量等。方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。

2023-08-28 21:24:06 1242

原创 JVM 垃圾收集

标记-整理算法主要用于老年代,移动存活对象是个极为负重的操作,而且这种操作需要 Stop The World 才能进行,只是从整体的吞吐量来考量,老年代使用标记-整理算法更加合适。,也即每次新生代中可用内存空间为整个新生代容量的90%(Eden的80%加上一个Survivor的10%),只有一个Survivor空间,即10%的新生代是会被“浪费”的。其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

2023-08-28 21:21:12 717

原创 JVM,JRE和JDK的区别

Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。众所周知java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows下,下皆以windows平台为例,linux下和solaris下其实类似,为:libjvm.so),这个动态连接库才是java虚拟机的实际操作处理所在。

2023-08-27 21:28:11 1755

原创 MySQL 更新语句是怎么执行的

从上图可以看出,MySQL 在执行更新语句的时候,在服务层进行语句的解析和执行,在引擎层进行数据的提取和存储;同时在服务层对 binlog 进行写入,在 InnoDB 内进行 redo log 的写入。update 语句的执行流程图,图中浅色框表示是在 InnoDB 内部执行的,深色框表示是在执行器中执行的。,一是 binlog 写入之前prepare状态的写入,二是 binlog 写入之后commit状态的写入。更新语句的执行是 Server 层和引擎层配合完成,数据除了要写入表中,还要记录相应的日志。

2023-08-27 14:53:33 238

原创 MySQL 日志系统

当 delete 一条记录时,undo log 中会记录一条对应的 insert 记录,反之亦然,当 update 一条记录时,它记录一条对应相反的 update 记录,如果 update 的是主键,则是对先删除后插入的两个事件的反向逻辑操作的记录。重做日志缓存、重做日志文件都是以块(block)的方式进行保存的,称之为重做日志块(redo log block),块的大小是固定的 512 字节。与 redo log 记录的是物理页的修改不同,undo log 记录的是逻辑日志。

2023-08-27 14:36:31 209

原创 MySQL有哪些常见的存储引擎?

MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。MySQL有9种存储引擎,不同的引擎,适合不同的场景,我们最常用的,可能就是InnoDB,应该是从5.5开始,就成为了MySQL的默认存储引擎。支持的数据类型有限制,例如,不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型。查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低。

2023-08-27 12:20:48 643

原创 MySQL 日期格式 DATETIME 和 TIMESTAMP

存储日期的方式mysql中存储日期的格式datetimetimestampDatetime和Timestamp的比较数值型时间戳(INT)DATETIME vs TIMESTAMP vs INT,怎么选?

2023-08-26 21:09:46 864

原创 Java 写完nextInt()之后写nextLine()要多写一个?

这涉及到了nextInt() 方法和nextLine()方法的消息处理机制了,当nextInt()读取到回车符或者换行的时候,就会停止且拿走前面的数据,但不会读取。,因此会留下来一个回车符或者换行。而nextLine()方法读取到换行就会结束,所以就相当于还没有开始就结束了。我想要输入一个数字之后再输入一行字符串,但是发现输入的字符串不对劲,或者说是会少一个。在第三行处我又写了一个nextLine(),这样下面才能正常地输入。今天做题的时候发现的一个小问题。

2023-08-25 21:44:13 109

原创 MySQL select语句的执行流程

等,涵盖MySQL 的大多数核 心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。key 是查询的语句,value 是查询的结果。因为mysql在执行过程中临时使用的内存是管理在连接对象里面的,虽然长连接可以减少建立连接的动作,但是长时间使用会占用内存过大。但是只要对表的内容有更新,这个表上的缓存就会被清空,因此使用查询缓存的效率并不高,在8.0之后mysql中已经将其废弃了。这个连接过程是使用的TCP连接,所以在经历过。

2023-08-24 22:10:09 148

原创 java 内存结构

虚拟机栈中的局部变量表部分存放了编译期可知的各种Java虚拟机基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2023-08-24 17:49:16 48

原创 用户态和内核态

其中 ring 0 权限最高,可以使用所有 C P U 指令集,ring 3 权限最低,仅能使用常规 C P U 指令集,不能使用操作硬件资源的 C P U 指令集,比如 IO 读写、网卡访问、申请内存都不行,Linux系统仅采用ring 0 和 ring 3 这2个权限。补充:3G-4G 部分大家是共享的(指所有进程的内核态逻辑地址是共享同一块内存地址),是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户态与内核态的概念就是C P U 指令集权限的区别。

2023-08-23 23:15:44 93

原创 CAS原子操作

乐观锁是一种并发类型的锁,其本身不对数据进行加锁通而是通过业务实现锁的功能,不对数据进行加锁就意味着允许多个请求同时访问数据,同时也省掉了对数据加锁和解锁的过程,这种方式因为节省了悲观锁加锁的操作,所以可以一定程度的的提高操作的性能,不过在并发非常高的情况下,会导致大量的请求冲突,冲突导致大部分操作无功而返而浪费资源,所以在高并发的场景下,乐观锁的性能却反而不如悲观锁。在volatile保证可见性就用到了Lock指令,在将自己处理器的数据写到内存上的时候,为了保证缓存一致性就是用的LOCK#信号。

2023-08-23 22:30:27 71

原创 锁的升级流程

四种锁的状态以及锁的升级

2023-08-23 22:00:43 55

原创 java volatile && synchronized

下面代码是一个小例子,Account类中有一个静态变量 i=0作为共享的资源,有一个计数的实例方法,在main方法中创建了100个线程去实现计数器的方法,运行这个程序最后输出的 i 的值并不一定是99,极可能是一个比99小的数,这是因为不同的线程可能同时对 i 进行了加1的操作,导致有线程做了“无用功”,最后 i 并没有加到99。在这里要提一句,在多处理器下运行的程序,若是其中某个变量改变,新的变量值并不会立刻就更新到内存,而是先在缓存中更新,定时再更新到内存中,这可能是基于速率或者其他条件的考虑。

2023-08-23 18:26:26 44

原创 java 桥接模式

桥接模式(Bridge)是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

2023-08-23 17:07:34 371

原创 java 观察者模式

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。目标与观察者之间建立了一套触发机制。目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。

2023-08-22 22:14:43 166

空空如也

空空如也

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

TA关注的人

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