SQL 事务
事物4个属性(ACID) A:Atomicity,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行; C:Consistency,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100; I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离; D:Durability,持久性,即事务完成后,对数据库数据的修改被持久化存储。 对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。 要手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务. 可能会出现的问题Dirty Read(脏读)指的是事物A在读取的时候读取到事物B刚刚更新但未提交的数据。 Non Repeatable Read(不可重复读)指的是事物A在事物开始时查询某行数据,之后事物B执行了更新操作导致事物A再读的时候两边数据不一致。 Phantom Read(幻读)在同一个事务中,使用相同的查询条件多次查询时,后续查询返回了之前没...
多线程基础(三) 线程池
使用线程池Java语言虽然内置了多线程支持,启动一个新线程非常方便,但是,创建线程需要操作系统资源(线程资源,栈空间等),频繁创建和销毁大量线程需要消耗大量时间。所以引入了线程池的概念。 简单地说,线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待状态。如果有新任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,新任务要么放入队列等待,要么增加一个新线程进行处理 ExecutorServiceJava标准库提供了ExecutorService接口表示线程池 123456789//创建固定大小的线程池ExecutorService executorService = Executors.newFixedThreadPool(3);for (int i = 0; i < 10; i++) { //提交任务 executorService.submit(new Task(Integer.toString(i)));}//关闭线程池executorService.shutdown(); 这里首先会执行 前三个任务,其他的任务会入队...
多线程基础(二)
线程同步概念:当多个线程同时运行时,先后顺序有系统去调动,程序无法决定。因此,在多线程环境下就可能造成一些问题。 12345678910111213141516171819202122232425262728293031public class Main { public static void main(String[] args) throws InterruptedException { var a = new ThreadA(); var b = new ThreadB(); a.start(); b.start(); a.join(); b.join(); System.out.println(Counter.counter); }}class Counter{ public static int counter;}class ThreadA extends Thread{ @Ov...
多线程基础(一)
多线程参考来源:多线程 - Java教程 - 廖雪峰的官方网站 多线程基础:在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。 某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。 进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。 多进程和多线程的方式比较。多进程与多线程比差别在于: 创建进程开销比线程大。 进程之间通信比线程要慢,因为线程之间通信可能就是读写同一个变量 多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃会直接导致整个进程崩溃。 创建新线程 使用extend Thread 重写run方法 1234567891011public class MyRunnable implements Runnable{ @Override public void run() { ...
设计模式
一、创造型模式1.工厂方法模式(2025年8月5日)工厂方法模式(Factory Method Pattern),属于创造型模式,旨在统一定义创造对象接口。可以通俗的理解成,在一般情况下不同的东西来源于不同的地方。现在统一了这个地方(factory),客户只需要根据自身需求去访问这个地方就能获得相对应的东西。其他逻辑无需改变。 优缺点优点: **解耦了对象的创建和使用:**调用方只需要考虑如何使用new出来的对象,不需要考虑他是怎么new出来的全部交给工厂来解决。 符合开闭原则,易于扩展: 当需要新加产品时只需要在工厂新加一个对应类和实现方法就行。在用户使用的地方无需修改 提高了代码的复用性和可维护性: 创建逻辑全部集中在工厂,避免重复造轮子。维护成本低。 缺点 类的种类增多 系统变得复杂 可能会过度设计 总而言之如果在维护一个后期看起来就会添加许多其他东西可以使用工厂模式,例如手机的支付方式。目前有银行卡,微信,支付宝。未来如果要添加其他的支付方式就可有使用这种设计模式。 2.参考deepseek给出的支付方式样例定义支付接口 12345// 支付接口 - 抽象产品publ...
滴答清单MCP
滴答清单 MCP 服务项目地址 https://github.com/ZH1754629545/dida365-mcp-servers 这是一个为滴答清单(TickTick/Dida365)开发的 Model Context Protocol (MCP) 服务器,使用 TypeScript 编写。该服务允许 AI 助手通过标准化接口与滴答清单 API 进行交互。 功能特性 ✅ 创建、读取、更新、删除任务 ✅ 管理项目和项目列表 ✅ 支持任务优先级和截止日期 ✅ 通过环境变量安全配置 API Token ✅ 完整的 TypeScript 类型支持 ✅ 错误处理和API响应验证 快速开始使用MCP (Node版本)DIDA官方获取tokenOpenAPI - API Doc 下载1npm i dida365-mcp-servers 配置json文件123456789"dida365": { "command": "node", "args": [//your download ...
spring AI 初步开发
spring AI 初步开发官方文档:Spring AIspring AI 极大的简化了对AI的prompt工程。可以区分为用户(user),系统(system),助手(assistant) 三个模块。以及Advisor(拦截器)、Tool(工具)、RAG(检索增强) 、MCP(模型上下文协议)等。 初始化项目: 官方文档:入门 :: Spring AI 中文文档 注: java版本17以上,这里选择21 1234567891011<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.0.0-SNAPSHOT</version> &...
智能BI项目 (完结?) RabbitMq 消息队列
最后主要是做了一个利用RabbitMq 去发布和接收生成图表的任务的工作。 Q:为什么要用RabbitMq ?用线程池不是已经解决了吗 A:在单机开发中线程池 确实能解决一些问题,但是到分布式环境中,使用消息队列可以更加方便的进行开发。因为消息队列可以算是一个跨系统的东西。可以很好的解耦合。而且线程池无法解决优先顺序问题。 为什么说前端监控系统离不开 RabbitMQ?前端监控系统是采集用户端的异常、性能、业务埋点等数据上报,在服务端做存储, - 掘金 消息队列: 我认为的消息队列它拥有可持久化,顺序化,有容错等,有很多方便的工具的东西。 持久化: 它可以把数据保存起来,即使重启也没事。并不像缓存那样。 容错机制: 他有一个死信队列的东西,专门用来解决如果出错了要怎么处理的方案。 分配机制: rabbitMq 有一个类似与计算机网络交换机,可以根据不同的routingKey(IP地址)去发送生产者的需求给目标消费者的消息队列。 消息确认机制: 当消费者接收消息后,可以返回消息(ack、nack、reject) 来告诉消息队列,然后进行相...
智能BI项目(五)线程池和队列
今天主要是新增了后端的线程池。利用线程池来限制BI项目用户生成AI图表的频率。也就是异步化业务 异步化任务: 通过异步操作让需要等待时间长的请求可以异步去完成。比如智能生成图表,如果是同步要等Ai返回则需要等上好久,用户就不能去做其他事情了。此时需要异步化:当用户提交需求时,直接返回已经收到任务结果。但是任务是否正在做需要后端自行解决。 好处: 优化了用户的体验(不需要一直等待)。 对于频繁的请求会有限制。(如果没有限制可能会有的问题,那么如果同时来了10几个或者上百个任务,那么调用AI接口会导致第三方API平台直接拒绝你的访问)。 业务流程 用户发送异步请求->后端->保存到数据库->发送到队列->能处理直接处理返回结果->不能处理但能入队(没有超过队伍数量最大值)然后等待处理返回结果->不能入队其他方法(生成失败); 使用线程池来完成异步化12345678910111213141516171819202122232425262728293031@Configurationpublic cl...
智能BI项目(四)分表和限流(令牌桶算法)
前端 没什么好说的就是新增了一个浏览我的图表的页面 后端:分表设计!! 原来这个分表的设计有个从csv里的数据得到的chartData字段。但是这个东西数据量大起来就会很影响查询速度。所以把chartData分出来一个表 每一个chartData都有一个chart_data_{charDataId} 好处: \1. 如果需要data数据的某一行可以快速找到。 2.加快chart表的查询速度。互不影响增加安全性 实现: 总共有三部分 创造动态新表,向新表插入数据,查询新表数据。 直接用sql语句。(但是要小心sql注入需要校验一下) 限流:面试必备:4种经典限流算法讲解最近我们系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法的实现的。 - 掘金 防止用户频繁操作。限制用户每分钟发送请求的次数。 使用Redisson自带的限流方案 令牌桶算法Redisson实现****令牌桶算法(trySetRate)。 相当于 有一个大鞋柜,大鞋柜里每个格子放了一双鞋子。 当学生过来拿鞋子,会判断有没有柜子有没有鞋子,有的话就拿走...