数据库的并发、锁机制与MVCC

数据库的并发、锁机制与MVCC在日常开发中,经常遇到数据库进行高并发操作的情况,但是我们处理并发一般都只在代码范畴而并不处理具体的数据库操作,这是因为数据库对基本的数据库操作做了锁处理,让我们可以忽略这一层的并发问题 详细可以参考Mysql的官方文档 注意:这一篇博客是针对MySQL数据库,且实用默认的 引擎InnoDb,使用其他数据库可能存在略微的差异 MySQL默认的数据库引擎InnoDB中Autocommit值为0(即自动提交事务)执行SQL语句的时候,每一条SQL语句都是一条单独的事务,所以并不存在并发的问题,数据库的锁机制已经做了很好的处理 但是当我们开启事务时,若不加处理,可能会产生一系列并发带来的问题
数据库的并发、锁机制与MVCC2021-01-24鱼鱼

让 AI 帮我把项目升到 Spring Boot 3:它扛了体力活,也埋了几个坑

让 AI 帮我把项目升到 Spring Boot 3:它扛了体力活,也埋了几个坑我们组有个内部服务,一直跑在 Spring Boot 2 上 2.x 早就停止开源免费维护了,安全扫描隔三岔五报一堆依赖漏洞,升级这件事拖了很久,终于排到了我头上 这次我决定全程拉着 AI 一起干 前后大概用了一周多(中间还穿插着别的需求),最后顺利上线 回头看,AI 确实帮我扛了大部分体力活,但也有几个坑是它挖的,或者至少是它没提醒我的 这篇把过程和教训记下来,给同样准备升级的同学参考 先声明:下面说的都是我们这个项目的情况,每个项目的依赖和历史包袱不一样,具体以 Spring 官方的迁移指南为准 一开始我问 AI:“把这个项目从 Spring Boot 2 升到 3,需要改什么?”它给了一份清单,大方向没错:Java 版本要 17 以上、javax 包要换成 jakarta、Spring Security 的配置写法变了,等等
让 AI 帮我把项目升到 Spring Boot 3:它扛了体力活,也埋了几个坑2026-10-14鱼鱼

JVM源码解析 从Launcher类浅谈ClassLoader(类加载器及双亲委派)

JVM源码解析 从Launcher类浅谈ClassLoader(类加载器及双亲委派)首先普及ClassLoader的基础:所有的Java类都是由ClassLoader由class文件加载进内存的,对于一个类,其唯一标识就是类名+加载他的ClassLoader(亦即对于不同的 ClassLoader,即使是加载了同一个Class也不能互通,本质上是两个类),其基本的分类如下图: BootstrapClassLoader是一个特殊的ClassLoader,负责启动时加载jre的类库 并不继承于ClassLoader,因为是jvm逻辑的一部分; ExtClassLoader也会加载jre类库,但是会加载那些额外的扩展类库(jre\lib\ext目录),到这个级别的 类加载器已经可以直接在代码中使用了;
JVM源码解析 从Launcher类浅谈ClassLoader(类加载器及双亲委派)2020-11-28鱼鱼

Springboot源码原理:从启动方法看配置加载

Springboot源码原理:从启动方法看配置加载首先看一个springboot项目的配置,我们可以定义一个application.yml,对于不同的环境有时也通过profile配置项指定不同的配置文件(譬如application-dev.yml),也可以通过命令行覆写具体的VM options配置项(举个栗子,启动时执行 java -jar xxx.jar --server.port=8080),此文讲解这些配制的读取原理 整体配置项的优先级从高到低为: 命令行配置; 系统属性(System.getProperties()) 系统环境变量 jar包外的主配置文件(带有) jar包内的主配置文件 jar包外的次要配置文件(由spring.profile指定的)
Springboot源码原理:从启动方法看配置加载2021-03-09鱼鱼

给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳

给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳做长任务 Agent 时,我最早的做法特别朴素:把所有中间结果、计划、反思,一股脑追加进对话上下文 反正模型“看得见”,多写点总没错 错就错在“多写点” 上下文很快又脏又长:旧计划和新计划并存,失败的工具输出还在,模型开始引用过期结论,或者在同一段推理上打转 更麻烦的是,你很难回答一个基本问题——此刻 Agent 到底相信什么? 后来我给 Agent 加了一个显式的“草稿本”(scratchpad):工作记忆外置到一块可读写的状态里,prompt 里只放当前需要的摘要和指针 稳定性和可调试性都好了不少 这篇讲讲为什么,以及我怎么划分什么该进草稿本 1. 噪声淹没信号 工具返回动辄几千字,失败堆栈、HTML 片段、长 JSON,全进上下文
给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳2026-10-14鱼鱼

Spring源码解析(1) 基于SSM看Spring的使用和Spring启动监听

Spring源码解析(1) 基于SSM看Spring的使用和Spring启动监听查看源码的顺序就见仁见智了,比较普遍的做法是从IoC入手,了解容器注入的每一个环节,掌握大致的流程 由于使用的是Spring,所以在这里我们引入比较古老的xml配置文件进行bean的配置,首先定义一个bean: 配置描述bean的xml,核心只有一行: 这样一来就可以使用BeanFactory这个容器来注入bean并使用了: 本来有封装好的XmlBeanFactory,这一类现在已经被弃用了,所以采用了他的父类DefaultListableBeanFactory;当然,也可以使用更加方便和常用的ApplicationContext: 当然从xml文件读取bean的配置只是其中一种目前用的不多的加载方式,还有基于包扫描等加载bean的方法,此处仅为理解IoC的基本使用
Spring源码解析(1) 基于SSM看Spring的使用和Spring启动监听2020-08-04鱼鱼

Java的SPI机制

Java的SPI机制SPI(Service Provider Interface) 是JDK内部提供的一种用于服务能力扩展的机制 在服务中通过不同的下沉方法实现能够加载不同的接口实现类,从而实现功能的热插拔 相比一些类似的设计模式(例如策略模式), SPI作为Java自带的实现特性,相对更加灵活和开放 我们常见的JDBC、日志框架slf4j、JavaMail、Spring等组件都基于 SPI实现(例如JDBC针对不同数据源的驱动) 之所以说区别于Java的一些设计模式,因为Java有一些实现能实现 SPI的动态加载 首先让我们定义 SPI对外提供抽象能力的接口类,这里为了便于理解展示包路径:
Java的SPI机制2024-10-14鱼鱼

分布式系统中的一致性算法和问题解决

分布式系统中的一致性算法和问题解决在撰写脑裂问题相关的博客时发现脑裂问题的产生原因在不同算法下的分布式系统各不相同,需要先大致了解一致性算法并针对性的解决 市面上有很多开源的分布式系统,他们的数据一致性算法不尽相同,例如k-v系统的祖师爷——zookeeper采用的是ZAB的算法,而最近流行的Consul是raft算法,不同数据中心server沟通的方式则是gossip协议 不同的协议和方式对选举和数据同步有不同的处理机制,利用这篇文章来对比常见的分布式一致性算法 一个系统可能会使用多个不同的一致性算法,以便于在不同的业务环节上有着各自更贴切的处理 ps:有种观点是一致性算法不是很准确,因为replica也能保证数据某种程度上具有一致性,有人称之为共识算法
分布式系统中的一致性算法和问题解决2021-03-13鱼鱼

MCP 协议入门:给 Agent 一个统一的“工具接口”

MCP 协议入门:给 Agent 一个统一的“工具接口”当 Agent 需要接入越来越多的外部能力——文件系统、数据库、GitHub、内部系统——每个工具都要自己写一套适配代码,非常繁琐 MCP(Model Context Protocol,模型上下文协议) 就是为了解决这个问题而提出的开放协议,由 Anthropic 发布,目标是让“AI 应用”和“外部工具/数据源”之间有一套统一的对接标准 本文从动机出发,讲清楚 MCP 的角色、能力、消息流程,带你用 SDK 写一个最小 Server,再用不依赖 SDK 的方式手写一遍协议交互来理解本质,最后总结安全注意事项、常见坑和 FAQ 从 N×M 到 N+M:Host、Client 与 Server 的分工
MCP 协议入门:给 Agent 一个统一的“工具接口”2026-10-14鱼鱼

AI 时代的编程语言选型:Python、Go、TypeScript、Rust 与 Java 怎么选

AI 时代的编程语言选型:Python、Go、TypeScript、Rust 与 Java 怎么选“该学哪门语言”“新项目该用什么语言”,这类问题每隔几年就会被重新讨论一次,而大模型的出现让它又多了几个新变量:模型和推理框架主要活在哪个生态里?AI 写代码时哪种语言更省心?Agent 要同时调用几十个工具、开几百个连接,并发模型撑得住吗?本文不做“语言排行榜”,也不宣布谁是赢家,而是从 AI 时代的选型维度出发,深入比较 Python、Go、TypeScript、Rust 四门语言,兼顾这个 Java 爱好者博客的主角 Java,再简要看看 C++ 与 C#,给出同一小任务的代码对照、一张综合对比表、按场景的选型建议、多语言组合架构思路,以及常见坑与 FAQ AI 时代选型新增的七个考量点
AI 时代的编程语言选型:Python、Go、TypeScript、Rust 与 Java 怎么选2026-10-14鱼鱼

子 Agent 的上下文隔离:派活时给什么,收回来要什么

子 Agent 的上下文隔离:派活时给什么,收回来要什么我第一次在自己的 Agent 里用“子 Agent”,动机很朴素:主任务的上下文太长了 主 Agent 在帮我做一次跨模块的重构,前面已经读了一堆文件、讨论了好几轮方案,这时候它需要搞清楚“仓库里有哪些地方调用了某个旧接口” 这种搜索很费上下文:要翻很多文件,大部分都是无关的 于是我想,把这个搜索派给一个子 Agent 去做,让它搜完只汇报结果,主 Agent 的上下文就干净了 想法没问题,但我前后改了三版才算勉强满意 这篇就聊聊这个过程里我对“上下文隔离”的理解:为什么要隔离、派活时给什么、收回来要什么,以及哪些情况其实不该隔离 最开始我图省事,直接把主 Agent 的完整对话历史复制给子 Agent,再加一句“请找出所有调用旧接口的地方”
子 Agent 的上下文隔离:派活时给什么,收回来要什么2026-10-14鱼鱼

把报错贴给 AI 之前,我先做的三件事

把报错贴给 AI 之前,我先做的三件事以前一看到红字堆栈,我的第一反应几乎是:全选、复制、粘贴进 AI 对话框,然后等它告诉我怎么改 说实话,这个习惯有一段时间挺好用 很多常见错误,它一眼就能看出来,比我自己翻文档快 可后来我发现,有一半以上“贴完还是修不好”的情况,并不是 AI 不行,而是我把一坨还没整理过的信息甩给了它 它只能在这坨信息上猜,猜错了也不奇怪 现在我会强迫自己先做三件小事,再决定要不要问、怎么问 这三件事加起来通常不超过五分钟,但后面少绕很多弯路 不是真的要自己把根因找出来,而是先回答两个很朴素的问题: 这条报错,我看得懂“是什么”吗?发生的位置,离我刚改的代码近吗? 很多堆栈很长,真正有用的往往就那么几行:异常类型、消息正文、以及“第一次进入我自己代码”的那一帧
把报错贴给 AI 之前,我先做的三件事2026-10-14鱼鱼
网站地图
1
首页 博客 {{screen}} 第 {{page}} 页
博客索引
{{blog.createDate}} ◔ {{blog.timeline}} 小头像 {{blog.author}} {{tag}}
{{blog.likeCount}}{{blog.commentCount}}
分类下暂时没有文章哦!
主题分类
{{taggroup.label}} 

{{tag.value}}