自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL当中的Lock

会经历一段时间后超时而取消执行,同样我们使用ctrl+c也能终止掉这个操作,但是,此时我去查看锁的状态时,发现事务修改时他持有的锁并没有释放,也就是说在一个大事务操作里面,一个小事务中可能由于一些原因失效了,没有执行,但是他持有的锁的资源并没有被释放,你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。但是是可以的,理论也是应该可以的,因为我们并没有去锁住test20这条记录,是严格小于符号。

2025-02-28 15:21:52 1340

原创 Java对接AI大模型(二)【Langchain4j记忆化】

上文已经提到Langchain4j基本的对接模型应用、日志、流式响应等功能。可细心的同学使用的时候应该发现啦,这个大模型他并没有任何记忆。例如你的第一句话是我叫张三。而下一句话请问他你是谁时,LLM似乎并没有记下来你的话。所以本文主要目的就是来介绍一下Langchai4j框架对接的大模型如何让他有记忆。注意:若要跟着实现,务必阅读上文文章过后再接着学习。

2025-02-25 19:19:52 1463 2

原创 Java状态机

我们可以定义一个状态机,并声明两个变量,一个用来记录状态变化的记录,一个用来记录要经过下一个状态需要的源状态与事件。在生成一个状态机的过程,我们将记录他需要变化的所有的状态,事件以及转换。过渡类的内容为@Data/*** 起始状态*//*** 动作*//*** 目标状态*/

2025-02-18 22:41:17 758

原创 Java对接AI大模型(一)【Langchain4j】

随着AI大模型技术的升起,人们越来越感觉到生活上的便捷以及人机对话照进现实.什么是大模型呢?大模型(Large Model),通常是指参数量非常庞大的深度学习模型,特别是在自然语言处理(NLP)、计算机视觉(CV)等领域中,模型参数数量达到数十亿甚至数千亿的规模。为了弥补Java在AI领域的工具短板,现在市面上出现了几款针对Java的AI开发工具.

2024-12-01 20:54:29 5000 14

原创 Spring挖掘: (事务篇)

Spring的事务为我们提供了非常便携的事务功能,只需要你添加@Transactional注解即可.但需要注意的是,Spring的事务是需要数据库本身具有事务功能的支撑,才能完成事务的功能,也就是他是基于数据库的事务功能进行的.没有数据库事务的支持,Spring是无法提供事务功能的.我们就从这个注解入手,来看看Spring是怎么完成事务的功能的设计的.

2024-11-11 16:49:58 977

原创 HashMap(深入源码追踪)

一篇让你搞懂HashMap的几个最重要的知识点,往源码跟踪可以让我们很轻松应对所谓的一些八股面试题.

2024-11-10 22:55:35 1025 1

原创 Spring挖掘:(AOP篇)

AOP(面向切面编程,Aspect Oriented Programming)是一种编程技术,旨在通过预编译方式或运行期动态代理实现程序功能的统一管理和增强。AOP的主要目标是在不改变原有业务逻辑代码的基础上,添加或修改非核心业务逻辑,如日志记录、性能监控、安全检查等。这种方式有助于减少代码重复,提高代码的模块化程度,降低系统组件间的耦合度,进而提升软件的可维护性和可扩展性

2024-11-07 00:46:55 929 1

原创 Spring自动装配(特别版)

今天整理了一下Spring自动装配的过程,也突出了几个比较难以解答的问题.实践来求真知.

2024-10-30 16:30:34 758

原创 Auth2.0单点登录(企业开发流程)

实习中接到需求单点登录,记录一下单点登录在企业中的实际应用。其实单点登录在不同的业务中处理细节还是不相同的,我这里仅举例我们这个需求中如何处理的一种情形。

2024-10-08 23:12:26 1349 3

原创 Mybatis-Plus新花样(二)

定义类继承,重写方法@Override//1. 创建sqlSource, 通过sqlSource可以获取sql//2. 添加到mappedStatement中在mapper层写入我们自定义的方法,必须和自定义的方法名保持一致。@Mapper。

2024-10-01 20:23:07 1320

原创 Mybatis-Plus新花样(一)

Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,。在MyBatisPlus中,AR模式即在实体类中封装了对数据库的访问,而不通过mapper类。

2024-10-01 20:15:36 580

原创 SQL.LeetCode(1321)餐馆营业额变化增长

而除去前六天的数据可以已时间的差值来进行判定,拿到所有时间中的最小值,然后当天的时间剪去最小值的时间如果大于等于6就行。我们可以跳过前六天的数据,然后获取后面所有的数据即可,但是遇到一个麻烦的事,MySQL当中没有这样的语法说获取到后面所有的数据。每一天是有多条记录的,也就是会有多个顾客购买,我们应该是基于当天的总额来进行窗口的计算。我们知道一定的是基于七天的一个度量去进行计算,所以我们可以联想到一个窗口,窗口的大小固定为7,基于当天我们这个窗口包含住前6天的数据进行计算来得到结果。需要运用两次窗口函数。

2024-09-12 11:57:27 1377 1

原创 MySQL定长窗口SQL

定长窗口可以基于行数或时间范围定义,适用于滚动总和、滚动平均等场景。使用可以精确控制行数的范围,使用可以基于数值或时间范围定义窗口。和ORDER BY是常见的窗口函数参数,用于分区和排序数据。这些功能使得 SQL 能够轻松处理数据的复杂分析任务。

2024-09-12 11:09:48 1465

原创 SQL.LeetCode(1193):每月交易Ⅰ

这主要是因为 SQL 的执行和解析方式。大多数数据库系统在解析 SQL 时,会优化查询。SQL 引擎解析GROUP BY时,会识别SELECT中定义的表达式。在SELECT中定义的month只是对的别名,数据库在执行GROUP BY时,实际上已经识别到它是,然后按这个表达式来进行分组。country,:在SELECT中计算每条记录的月份,并为其定义别名month。:在这里,SQL 引擎会识别到month实际上指的是,因此按月份和国家进行分组。总结:尽管 SQL 查询执行顺序中,

2024-09-08 13:10:10 1227

原创 MySQL常用函数(总结)详细版

【代码】MySQL常用函数(总结)详细版。

2024-09-08 00:50:45 3866

原创 MySQL常用窗口函数总和

窗口函数提供了强大的分析能力,允许在不改变结果集的情况下执行复杂的计算和聚合操作。通过适当使用窗口函数,可以轻松实现排名、运行总和、前后比较等常见的分析需求。

2024-09-04 20:51:50 1167

原创 理解数据库表之间的五种连接方式

INNER JOIN是一种非常常用的 SQL 连接类型,它可以帮助你结合多个表中的数据,只返回那些在所有参与的表中都有匹配项的行。这对于构建报告、分析数据以及任何需要合并不同表中的信息的应用都非常有用。LEFT JOIN和RIGHT JOIN是 SQL 中非常有用的连接类型,它们可以帮助你在连接两个表时保留一侧表中的所有行。具体选择哪种连接类型取决于你希望保留哪一侧表中的所有行。如果你不确定应该使用LEFT JOIN还是RIGHT JOIN,可以考虑使用INNER JOIN。

2024-09-04 10:33:46 4001

原创 深刻理解JDK中线程池的使用

有时候我们可能需要排查日志,但是如果使用Jdk自带的线程工厂,会导致日志不清晰,不清楚这个线程池具体运用于哪种业务,所以我们需要自定义一个线程工厂来帮我们打印更有意义的日志我们来查看一下JDK源码,看看JDK是如何打印线程日志的原来是通过AtomicInteger原子性CAS操作,是线程数加1.所以我们查看的日志就是namePrefix拼凑而成.我们可以效仿这样的方式,实现一个自己的线程工厂.//传入线程池的名字参数group = (s!= null)?

2024-08-23 22:27:20 994

原创 LeetCode84(柱状图中最大的矩形)理解单调栈

我们需要找到左边第一个比他小的柱子高度与右边比他小的第一个柱子的高度.我们会发现数组本身就是单调的,这样按照我们之前的思路,会导致全部存入栈中,而没有产生计算.那我们如何去触发计算呢?对于每一个柱形,我们得先选取一个基准.什么叫基准呢,就是以这个柱子的高度,去找寻能够凑成与这个柱子构成的矩形.所以我们的栈里面是单调递减的.这样我们再来解释一下,如何从这样一个单调栈中找到第一个比此时柱子高度小的值.这样一看,对于此时基准6而言,左右都不能扩展,此时算出的矩形面积应该就是他自己本身构成的矩形。

2024-08-23 20:14:27 945

原创 RPC远程调用框架Dubbo

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务。大白话理解就是:RPC让你用别人家的东西就像自己家的一样。屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法隐藏底层网络通信的复杂性,让我们更加专注业务逻辑。常用的RPC框架RPC是一种技术思想而非一种规范或协议。阿里的 Dubbo/Dubbox、Google gRPC、Spring Cloud。

2024-08-06 18:33:46 1281 2

原创 详解Java中线程的状态切换

被唤醒的线程不会立刻执行,而是会转变为阻塞(blocked)状态,去竞争之前释放的锁。如果竞争成功,线程将获取到锁,状态转变为可运行(runnable)状态,随后由JVM的线程调度器决定何时执行该线程。然而,实际执行还取决于线程调度器的调度策略和其他线程的执行情况。如果此时CPU资源可用,并且没有其他更高优先级的线程正在执行,那么线程调度器可能会立即调度该线程执行。如果没有竞争到,它实际上等待的时间可能会比之前睡眠的时间要久,这取决于系统的整体负载和线程调度器的行为.方法返回时,它的状态会从。

2024-07-25 23:50:04 1148

原创 Java中锁的全面详解(深刻理解各种锁)

让锁记录中 Object reference 指向锁对象,并尝试用 cas 替换 Object 的 Mark Word,将 Mark Word 的值存入锁记录。如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁.创建锁记录(Lock Record)对象,每个线程都的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的 Mark Word。并将锁记录里的owner指针指向对象头的MarkWord。

2024-07-17 23:59:37 1713

原创 Git全面详解,深入了解Git(包含解决分支冲突,分支合并等)

Git是一种代码托管技术。在开发中,Git是一种代码托管技术,很多代码托管平台也是基于Git来实现的。Git可以帮我们做到很多的事情,比如代码的版本控制,分支管理等。我们可以把Git理解成是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。正是因为有了Git的存在,现在很多工作才可以变得相对轻松。SSH为Secure Shell(安全外壳协议)的缩写,由IETF的网络小组(Network Working Group)所制定。

2024-07-16 23:51:55 4163

原创 详解接口幂等性及其处理方案

那我们得借用一下redis老哥啦,我们在进入这个页面随机生成一个UUID携带,然后配置一个拦截器,当我们请求添加时,拦截器拦下,检查是否携带这样一个标志,如果存在,我们剔除,如果不存在,我们直接打回.想想,我们想要它能够幂等就得保证唯一,我们能通过什么手段保证传过来这么多次是唯一的呢?在我们实际开发场景当中,很多时候都会有重复消费的业务场景出现.这是我们不希望出现的.例如。,如何保持我们只消费一次的现象,成为了一个难题.,所以我们就不会让他添加,构成幂等性的条件.还有就是删除一条数据时,我们删除过后,

2024-07-12 23:52:14 1091

原创 LeetCode67(二进制求和[位运算,大数运算])

我们可以将两个字符串的二进制转成十进制,获取对应值相加之后,我们可以不断对2取余,获取尾数拼接即可.也就是像我们平常求一个十进制的二进制数,可以递归调用,同样也可以迭代.官方题解当中给我们介绍了一种Java自带的API解法,如下所示。我们讨论的情况当carry = 1时.属于x,y中最多只有一个数出现为1时,我们需要进位 置1.也就是我们进行xy的异或运算后再进行对carry的&运算.其次我们来求得需要进位的位置,需要进位其实就是上下两端都等于1时,所以我们可以用&运算来实现我们的需求。

2024-07-09 10:24:03 1414

原创 LeetCode42(接雨水)[三种解法:理解动态规划,双指针,单调栈]

我们应该在栈中无元素时,不用再进行求值,因为此时说明是边界情况,对应此时红框中的情况,当我们计算完pop处之后,下一次循环,我们将弹出peek处的元素,此时它的左边没有元素,也就是对应着此时栈中没有元素.我们不需要再进行求值.还有一点不同的是,我们遍历处的height[j] 与我们的栈顶元素是有一段宽度的,我们计算面积应该带上宽度的乘积,及宽度长度为 i - peek - 1,对应的情况为。对于这一小块,我们观察到积水处的左右两边好像跟我们拿其左右两边最大值与它身边两个的最小值所取到的积水处的值是一样的.

2024-07-08 20:56:03 1899 3

原创 Bug记录:【com.fasterxml.jackson.databind.exc.InvalidDefinitionException】

这个错误是由于库在尝试序列化com.jingdianjichi.subject.common.entity.PageResult类时遇到问题,因为它没有找到可以序列化的属性。具体来说,PageResult类可能是一个空类,或者它的所有属性都被标记为不可序列化。要解决这个问题,可以采取以下几种方法:是库中的一个序列化特性,它决定了当Jackson尝试序列化一个没有任何可识别属性(即没有getter方法、字段或@JsonProperty注解的属性)的Java Bean时应该采取的行为。

2024-07-07 23:37:46 1073

原创 Java中线程的常用方法(并发编程基础)

假设有两个线程 A 和 B,线程 A 在执行过程中调用了线程 B 的 suspend() 方法来暂停线程 B,然后线程 A 需要在某个条件满足时恢复线程 B,于是调用了线程 B 的 resume() 方法。: 停止进程运行,相当于直接杀死进程,这样容易造成死锁,因为可能这个线程拿到了锁的资源,直接杀死导致锁资源没有被释放,别的线程获取不到锁,造成死锁.注意一下,介绍一下Thread.interrupted(),这个方法会返回当前线程的打断标记,若为true,将值返回后会自动重新刷新为false.

2024-07-06 00:39:05 1367

原创 JUC并发编程基础(包含线程概念,状态等具体实现)

在系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源.也被叫做轻量级进程,在同一个进程内会有1个或多个线程,是大多数操作系统进行时序调度的基本单元也被称为Monitor(监视器),也就是平时我们所说的锁.继承重写执行注意:启动线程是调用父类的start方法,而不是直接去调用run方法.实现重写主函数启动线程当然我们还有另外一种写法注意到Thread的构造方法的参数有里面存在一个。

2024-07-05 17:14:20 934

原创 JVM的五大内存区域

垃圾回收器负责在堆上进行垃圾回收,以释放不再使用的对象。在JDK 8及之后的版本中,永久代被移除,取而代之的是元空间(Metaspace),它使用本地内存来存储类的元数据。:每个线程在执行Java方法时,都会创建一个对应的栈帧(Stack Frame),用于存储局部变量、方法参数、操作数栈和动态链接等信息。每个线程都有自己独立的程序计数器,用于记录当前线程执行的位置,以便线程切换后能够恢复到正确的执行位置。本地方法是使用其他语言(如C、C++)编写的方法,它们与Java代码进行交互,需要独立的栈来支持。

2024-07-04 23:56:32 632

原创 玩玩快速冥(LeetCode50题与70题以及联系斐波那契)

对于0阶台阶,我们只有一种方法到达,而对于1阶台阶我们也是只有一种方法到达.对于F(2),即2阶台阶,我们有两种方式到达,走两步或者一次性走两步.根据公式也能推导F(2) = F(1) + F(0).依次类推F(3) = F(2) + F(1) = 3次。这道题一看很平常啊,不就一直乘嘛,循环走一次就够了.但是很抱歉,单纯的想法终究迎来了超时.而且还是个中等的题目,意识到没那么简单.我们需要换种思路.而对于[{f(n),f(n-1)}]的矩阵我们依旧可以像这样展开,所以最终能得到。

2024-07-03 22:22:01 1046

原创 浅谈一下Mybatis当中插入主键返回的两个属性(useGeneratedKeys,selectKey)

注意:使用MySQL的last_insert_id()函数时,before必为false,也就是说必须先插入然后执行last_insert_id()才能获得刚刚插入数据的ID。而第二次再插入,主表又插入了一条记录,此时应该返回id = 2,由于是先查询再插入,之前由于异常,今天遇见两个Mybatis当中很有像似点的属性,仔细研究了会.发现还是有带你不同.就是想象一个业务场景,主表插入一条记录,比如此时返回id = 1.表示生成的主键放回到传入参数的成员变量当中).,表明是否将插入生成的主键返回到参数当中.

2024-07-01 23:41:43 622

原创 LeetCode热题100(136.只出现一次数字)

但是这种方法性能太低,时间复杂度为O(n),并且我们需要建立数组或者Map集合来统计次数,不符合题目的限制.我们可以暴力遍历,统计所有数字出现的次数,最后回过头来再遍历找到只出现一次那个数字.是不是结果会是0,因为数字相同代表每一位都相同,所以异或以后就是0.我们注意到这道题,其他数字出现都是两次,所以我们应该换一种思路.那我们借助这种运算特性,如果数字相同的异或,那会有什么结果呢?异或运算就是对位不同置为1,对位相同置为0.输入:nums = [4,1,2,1,2]输入:nums = [2,2,1]

2024-06-22 14:00:54 826

原创 阐述Spring Security概念及其运用于实战

Spring Security是Spring项目组提供的安全服务框架,核心功能包括和.为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作.在如今开发模式中,已经成为Java程序员必备的一项技术,简化认证和授权开发的首选项,其核心为认证和授权,我们先来了解一下何为认证和授权,理解其概念.

2024-06-21 22:55:27 1496

原创 阐述常见的一些SQL优化方式

在 MySQL 5.0 之前的版本要尽量避免使用 or 查询,可以使用 union 或者子查询来替代,因为早期的 MySQL 版本使用 or 查询可能会导致索引失效,高版本引入了索引合并,解决了这个问题。这个是老生常谈,但还是经常会出的情况,SQL查询的时候,应该只查询需要的列,而不要包含额外的列,像 select * 这种写法应该尽量避免。利用覆盖索引InnoDB使用非主键索引查询数据时会回表,但是如果索引的叶节点中已经包含要查询的字段,那它没有必要再回表查询了,这就叫覆盖索引。,也无法作为覆盖索引。

2024-06-19 22:58:37 565

原创 浅挖一下String类,解决String常见的面试题

一般来说,在实际使用中:如果操作的数据量较小,可以使用String类。但是不同的是,String str1 = new String(“abc”) 还会通过 new String() 在堆里创建一个 “abc” 字符串对象实例。需要注意的是,虽然boolean类型在逻辑上可能只占用1位,但在实际的内存存储中,JVM可能会为其分配更多的空间(例如,在数组中,每个boolean元素可能会占用一个字节)Java会在编译期对“+”号进行处理。String的确是不可变的,“+”的拼接操作,其实是会生成新的对象。

2024-06-17 22:32:38 1184 4

原创 面试题(TCP/IP协议)详解三次握手

在两次握手的情况下,只有客户端向服务器发送请求建立连接的SYN包,服务器收到后确认即可建立连接。在三次握手的过程中,双方会交换初始序列号,以便在后续的数据传输中能够正确地识别和处理接收到的数据。,当服务器能够接收到了客户端的信息,说明服务器的接受信息没有问题,所以发出消息让客户端知道自己的接受信息能力没有问题,同时也能让客户端知道它的发送能力没有问题.:在数据传输之前,TCP 必须先建立连接(三次握手),在数据传输结束后,还要终止这个连接(四次挥手)。通过进行三次握手,可以避免这种情况的发生。

2024-06-16 18:33:10 719

原创 JavaSLF4J日志中一些性能提升优化

slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。库提供的注解,它允许你在编译时自动为你的类添加一个 SLF4J 的 Logger 实例,从而避免了手动声明和初始化 Logger 的样板代码。例如: 所在包下设置的info级别的日志输出,此时若使用log.debug,便不会有日志输出,只有大于等于info级别的才会输出。slf4j只是一个日志标准,并不是日志系统的具体实现。

2024-06-15 19:12:46 568 1

原创 leetcode(SQL)1251.平均售价

接下来就简单了,我们需要计算平均售价即可,注意一个小问题,当没有销量时,平均售价应该是为0,而不是null,所以我们需要加入if判断.由于需要保留两个小数,所以最后的结果需要调用round函数.(记住还需要以商品id为分组哦,因为我们统计的是每一个商品的平均售价)注意产品的价格是在不同时期有着不同的价格.所以我们应该还需要加时间的判断加入进来.那我们是将时间的判断放在where当中呢?prices 表的每一行表示的是某个产品在一段时期内的价格。该表的每一行表示的是每种产品的出售日期,单位和产品 id。

2024-06-15 12:06:39 694

原创 Redisson快速入门及可重入,可重试,看门狗机制原理

我们再来看看释放锁的源码,实际上也是Lua脚本.解释一下这段Lua脚本同样对应着我们上方流程图的逻辑,释放锁时先检查是不是自己线程的这把锁,如果不是,直接返回Nil.

2024-06-14 20:44:22 1320

空空如也

空空如也

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

TA关注的人

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