- 博客(268)
- 资源 (2)
- 收藏
- 关注
原创 【设计】设计一个Web版数据库管理平台(之七):多数据库类型易扩展
在之前的博客中,我们写过简单的Dialect,实现每种数据库不同的分页需求。但是没有正式讨论,这个平台如何更好的适配多种数据库类型。今天,我们就讲下这个课题。以下,未完待续!!!
2026-10-31 22:43:22
174
原创 【设计】设计一个Web版数据库管理平台(之六):SQL执行监听器 —— 日志、监控与审计
为解决平台用户增多后日志缺失、慢SQL难追踪、操作无法审计的问题,本文引入SQL执行监听器机制。通过在Executor层插入beforeExecute、afterExecute、onError三个关键节点,实现对SQL执行的完整记录。采用责任链模式设计监听器链,支持多监听器按序执行,并通过ListenerRegistry统一管理。该方案不侵入核心执行逻辑,可有效支撑性能排查、操作审计与慢SQL治理,显著提升系统可观测性与运维能力。
2026-09-28 11:11:46
319
原创 【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
<think>我们需要理解用户请求。用户提供了一段关于优化点的详细描述,然后要求“根据以下内容,生成≤150字的文章摘要”。所以我们需要根据给定的“优化点一~四”的内容,生成一个不超过150字的摘要。摘要应概括这些优化点的核心思想。注意字数限制。 内容主要是针对一个类似MyBatis的数据库操作框架,提出四个优化点: 用注册表替代硬编码Switch-Case,解决开闭原则。 用工厂模式解耦对象创建,解决依赖倒置。 借鉴MapperMethod思想,封装SQL指令而非散落的if-else。 引入拦截器机制,抽
2026-08-31 22:32:38
253
原创 mybatis源码总结
MyBatis源码中的核心对象设计体现了框架架构的关键思想。Configuration作为"中央情报局"聚合所有组件,通过牺牲单一职责换取全局共享便捷性;ObjectFactory提供对象创建的扩展点;Registry体系将配置元数据与执行逻辑解耦,采用分类管理策略;Handler机制通过策略模式实现处理流程的灵活性。这种"胖中心+扩展点+分类管理+策略抽象"的组合设计,平衡了代码复用与扩展性,是框架设计的典型范式。
2026-07-31 21:34:49
196
原创 【设计】设计一个web版的数据库管理平台后端(之四) -- 补全DDL、DML功能
本文介绍了一个Web版数据库管理平台的后端设计,重点补充了DDL和DML功能。架构采用分层设计,包含SqlSession、Executor、StatementHandler和ResultSetHandler四个核心组件。SqlSession提供统一的API入口,Executor负责执行不同类型的SQL操作,StatementHandler处理具体SQL执行,ResultSetHandler仅用于SELECT查询结果转换。各层职责明确:SELECT返回List<Map>,DML返回影响行数,DDL返回执行状态
2026-06-30 22:53:58
220
原创 【设计】设计一个web版的数据库管理平台后端(之三) -- 多数据库通用分页
这篇文章介绍了一个Web版数据库管理平台后端的分页插件设计方案。主要内容包括: 架构回顾:基于MyBatis风格的数据库访问框架,包含SqlSession、Executor、StatementHandler等核心组件。 设计方案:在现有架构上增加分页功能,通过Dialect接口实现多数据库支持,分页流程包含总记录数查询和分页数据查询两个步骤。 核心实现: 定义PageParam分页参数和PageResult分页结果模型 采用策略模式实现不同数据库方言(MySQL、Oracle、SQLServer等) 增强C
2026-05-31 10:42:12
273
原创 认识状态机(State Machine)
状态机(FSM)是一种数学模型,用于管理对象的状态转换。它通过定义状态(State)、事件(Event)、转换(Transition)和动作(Action)四个核心要素,使复杂逻辑变得清晰可控。文中以自动售货机为例,展示了状态机的实际应用:从待机(Idle)到已投币(HasMoney)、出货中(Dispensing)和找零(ReturningChange)的状态转换。通过Java代码实现,每个状态类处理特定事件,确保系统行为的约束性和鲁棒性。状态机模式能有效解决if-else嵌套和全局标志位混乱的问题,将流
2026-04-29 22:14:00
568
原创 利用 AQS 构建一个自己的公平共享锁
本文介绍了如何基于AQS实现一个公平的共享锁。与非公平版本相比,公平共享锁通过hasQueuedPredecessors()方法确保线程按等待顺序获取锁,避免饥饿现象。关键实现是在tryAcquireShared()方法中先检查是否有更早等待的线程,若有则直接返回失败;否则通过CAS循环获取许可。文章还解释了为何在判断无前辈等待后仍需CAS循环,并提供了测试代码验证公平性。该锁适用于需要保证线程获取顺序的共享资源访问场景。
2026-03-31 22:23:33
361
原创 利用 AQS 构建一个自己的非公平共享锁
特性独占锁 (前两篇)共享锁 (本篇)同一时刻持有者单个线程多个线程(受许可数限制)state 语义重入次数 (0=空闲,>0=持有)剩余许可数量核心 AQS 方法获取锁返回值boolean (成功/失败)int (负数=失败,非负数=剩余许可)唤醒策略唤醒后继的一个节点传播性唤醒后继的共享节点典型应用普通互斥锁、写锁读锁、信号量。
2026-03-01 17:02:37
949
原创 设计一个分页插件之二【基于mybatis实现分页插件】
本文介绍了如何实现一个MyBatis分页插件。首先定义了一个分页注解@PageQuery,用于标注需要分页的方法。然后设计了分页参数类PageParam和分页结果类PageResult。核心实现是PageInterceptor拦截器,它会拦截Executor的query方法,自动处理分页逻辑:1)获取分页参数;2)查询总记录数;3)构建分页SQL;4)执行分页查询;5)返回分页结果。支持多种数据库方言(MySQL、Oracle等),通过拦截SQL语句并改写实现物理分页。
2026-01-31 22:22:25
305
原创 2025技术总结
本文分享了关于AI辅助编程和项目管理的实践经验。在AI编程方面,作者比较了通义灵码、Claude sonnet4和Gemini-3等模型的使用体验,指出AI虽能辅助实现想法,但需要开发者具备纠错能力。在架构设计方面,强调项目初期架构的重要性,避免后期形成"屎山"。关于代码Review,作者认为需要技术leader把控代码质量,但要平衡规范与团队接受度。文章最后指出,对已形成"屎山"的项目进行重构具有很大挑战性。
2025-12-30 22:52:57
281
原创 利用aqs构建一个自己的公平独占锁
基于 AQS:重写 tryAcquire 和 tryRelease 方法。公平:线程按照请求顺序(FIFO)获得锁,避免线程“插队”。独占:同一时间只有一个线程能获取锁。
2025-10-31 18:01:27
242
原创 【图解】idea中快速查找maven冲突
今天启动项目时,总是以下报错,并退出SLF4J: Class path contains multiple SLF4J bindings.
2025-09-13 22:49:21
719
原创 使用cursor claude sonnet4的一些感受
文章摘要:作者分享了使用Cursor和Claude Sonnet4辅助编程的体验。主要在代码审查、开源框架分析和项目方案设计三方面使用,对前两个功能较为满意,但在项目方案设计时需要多次引导才能获得较理想答案。作者认为AI编程助手功能强大但仍有局限,需要程序员不断检查纠错,但相信未来AI会越来越智能,强调应主动掌握AI工具的使用权。(149字)
2025-08-31 22:40:45
401
原创 【设计】设计一个web版的数据库管理平台后端(之二)
本文介绍了如何参考Mybatis架构优化Web版数据库管理平台的SQL查询功能。原系统仅支持简单SQL执行,现通过引入分层架构实现结果集处理。核心类包括:SqlSession作为入口类,Configuration存储配置,Executor负责执行,StatementHandler处理SQL语句,ResultSetHandler转换结果集为List<Map>。类图展示了各组件间的组合与依赖关系,代码实现包含配置中心、SQL会话、执行器、语句处理器和结果集处理器等核心模块。该设计解耦了SQL执行过程
2025-07-27 15:18:12
811
原创 springboot中多个定时任务(@Scheduled)如何互不影响
摘要:Spring Boot中默认使用单线程执行@Scheduled定时任务,导致长时间运行的任务会阻塞后续任务。通过配置ThreadPoolTaskScheduler线程池(设置SchedulingConfigurer),可以让多个定时任务并行执行。关键步骤包括:1)创建ThreadPoolTaskScheduler实例;2)设置线程池大小;3)初始化并注册任务调度器。这样无依赖关系的定时任务就能在各自时间点独立执行,互不干扰。
2025-06-30 22:51:51
800
原创 利用SingleKeyDatabaseShardingAlgorithm,自定义分片算法实现
根据以上获取到的物理库名和表名,改写sql,替换sql中的逻辑库名和逻辑表名,就可以去执行真正的物理sql了。今天,我们主要来实现:doEqualSharding方法。
2025-04-30 17:38:15
325
原创 设计一个分页插件
我们手工实现,其实原理很简单,在我们用Java去连库执行sql前,首先连库去查询该sql的总数,即select count(*) from (你的sql) as temp,查出总数后,再真正执行你的sql,这样返回总数,及查询的结果。如果你的Java项目中,没有用mybatis,那查询数据库时,如何去实现分页呢?
2025-03-31 22:52:59
289
原创 特殊的跨年
2024年的最后一天,本来要写写技术博客的,但是此刻的我在医院的陪护床上,今天的技术博客是写不了了,所以今年的跨年也特别不同,只能陪着小孩在医院跨年了,随着年龄越来越大,事情越来越大,工作生活,还真的是不容易,以前我觉得自己对很多事都很乐观,但慢慢的,感觉思想也被各种压力充斥着,也没有那么乐观了。前几天,跟朋友聊天,说现在工作,活多身体累不怕,但是心累很烦人,每个人都不一样,我们认为好的,别人可能认为不好,你认为自己努力了,别人可能觉得你干的很差,是不是很累!只能说一切看开就好!
2024-12-31 21:45:40
242
原创 goInception审核、执行sql的相关知识
一、备份步骤配置备份数据库,并在执行SQL时开启备份功能在执行SQL前记录binlog位置和线程号(逐条执行逐条记录)执行SQL在执行SQL后记录binlog位置和线程号开始备份,解析远程服务器binlog在备份服务器创建备份库创建备份信息表,写入执行信息和binlog位置信息创建备份表,逐步解析binlog,并生成回滚语句,写入备份表
2024-11-30 21:45:57
519
1
原创 浏览器发送请求后关闭,服务器的处理过程
当浏览器在服务器返回结果前关闭时,服务器通常会继续处理请求,直到它尝试发送响应数据时发现连接已被断开。这时,服务器会记录错误并关闭连接。浏览器会检测到连接中断,并显示相应的错误消息。具体的行为取决于使用的HTTP版本(HTTP/1.1 vs HTTP/2)以及服务器和浏览器的具体实现。
2024-09-29 09:59:55
1192
原创 Durid解析SQL语句
在外面的需求中,有很多需要解析SQL语句的地方,我们采用Durid来进行解析。Durid可以将sql进行详细的拆分成多个部分。所有的AST节点都支持Visitor模式。可以利用访问者模式获取一些信息。
2024-08-31 22:09:01
558
1
原创 设置用户访问hdfs
如果hadoop没有启Kerberos或者从Kerberos获取的用户为null,那么获取HADOOP_USER_NAME环境变量,并将它的值作为Hadoop执行用户。如果我们没有设置HADOOP_USER_NAME环境变量,那么程序将调用whoami来获取当前用户,并用groups来获取用户所在组。但是,实验后,发现好像要以上2个都加上,才有效。
2024-06-30 22:55:35
475
原创 Java操作hdfs,总是报ClosedChannelException
会报 java.nio.channels.ClosedChannelException: null at org.apache.hadoop.hdfs.ExceptionLastSeen.throwException4Close。logger.info(“文件名称: {} 耗时: {}”, dst, end - start);logger.error("文件:{}, 上传错误!// 关闭FileSystem对象。// 创建Hadoop配置对象。// 上传文件到HDFS。
2024-04-03 16:56:54
575
原创 [设计模式]责任链模式实现 申请聚餐费用流程
然后,它创建了一个聚餐费用申请,并将其提交给项目经理进行审批。也就是说,当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。
2024-03-05 16:35:59
624
原创 【设计】设计一个web版的数据库管理平台后端精要
springboot设计开发一个系统,在这个系统的数据库表中存放着2000个数据库实例,有MySQL、Oracle、sql server3种数据库类型,用户可以在页面上选择不同的实例,连接这些实例上的数据库,来执行业务sql。
2024-02-29 18:34:22
907
原创 [设计模式]某一个流程中,经理可以指定其他人员代替经理审批流程
在这个场景中,我们可以定义一个抽象的审批流程接口,例如 ApprovalProcess,其中包括审批的方法。Manager 类中可以定义一个包含代理对象的成员变量,例如 ProxyApprovalProcess。在需要指定他人代替审批的情况下,经理可以调用 ProxyApprovalProcess 的相关方法,将审批委托给其他人员进行处理。可以使用代理模式来实现经理可以指定其他人员代替审批流程的功能。代理模式允许通过一个代理对象来控制对原始对象的访问,从而在不改变原始对象的情况下,增加额外的逻辑处理。
2023-12-27 15:25:22
606
原创 MySQL之慢查询
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高。2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)3.order by limit 形式的sql语句让排序的表优先查。0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE。6.观察结果,不符合预期继续从0分析。5.加索引时参照建索引的几大原则。4.了解业务方使用场景。
2023-10-30 23:28:11
197
原创 玩碎Java之CompletableFuture的例子
如上代码块所示,doGet方法第三行通过supplyAsync向threadPool1请求线程,并且内部子任务又向threadPool1请求线程。threadPool1大小为10,当同一时刻有10个请求到达,则threadPool1被打满,子任务请求线程时进入阻塞队列排队,但是父任务的完成又依赖于子任务,这时由于子任务得不到线程,父任务无法完成。主线程执行cf1.join()进入阻塞状态,并且永远无法恢复。为了修复该问题,需要将父任务与子任务做线程池隔离,两个任务请求不同的线程池,避免循环依赖导致的阻塞。
2023-09-30 22:31:21
350
原创 玩碎Java之new Thread与completableFuture竟然结果不一样
大家想想以上2段代码的输出都是什么呢?是一样的么?结果,ccccccddd科学吗?不应该一样吗?
2023-06-30 15:44:44
330
1
原创 一个命令搞定Linux大文件下载
对于大日志文件,我们可能只需要今天的内容,今天之前的内容不需要查看,所以我们可以对日志文件进行分割,只下载我们需要的片段即可。例如: split -b 50K -d messages.9.gz messages.9.gz.将messages.9.gz 分割成50K大小包,压缩包前缀是: messages.9.gz.以上2个问题,都可以通过Linux一个命令来帮忙 - split。通常,我们可能不知道这个文件有多少行,还可以用以下文件大小分割。让我们先来看看split的帮助文档。很有助于问题的排查速度!
2023-05-24 21:31:08
2807
ssh secure shell 绿色
2012-03-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅