- 博客(750)
- 问答 (7)
- 收藏
- 关注
原创 使用springboot+flowable实现一个简单的订单审批工作流
这段代码是 Flowable 工作流框架中的「服务任务(Service Task)」执行器,实现了 Flowable 提供的 JavaDelegate 接口,核心作用是:当流程执行到绑定该类的「创建订单」服务任务节点时,自动触发 execute 方法,打印订单创建成功的日志,并从流程上下文获取 order 变量。在flowable-ui模型列表中点击要导出的模型,在弹出的模型详情页面中点击右上角的下载图标,即可将模型导出为xml文件,点击后自动生成文件名,使用默认的文件名即可。
2026-03-22 10:55:38
435
原创 使用docker创建flowable容器
1、从指定仓库拉取flowable镜像如果直接从dockerhub官网拉取可能会失败,这里使用国内当前可用的一个镜像库拉取2、使用第1步拉取到镜像创建和启动一个flowable容器,映射端口 8080(主机端口:容器端口)下面命令中我指定镜像仓库和镜像名称,如果不指定,执行命令还是会从官网镜像库拉取。3、启动成功后,使用浏览器访问flowable-ui,地址为部署的服务器ip:端口/flowable-ui默认账号admin,密码test可选:进阶配置。
2026-03-21 16:02:04
136
原创 使用ShardingSphere实现MySQL读写分离(二)
本篇博客介绍使用ShardingSphere实现mysql读写分离,基于上一篇博客搭建好的mysql一主二从的架构。
2026-03-17 17:11:15
211
原创 使用ShardingSphere实现MySQL读写分离(一)
本篇先介绍mysql一主二从的搭建1、配置mysql一主2从这里我使用docker创建3个mysql容器:1、容器A:端口3309,充当主服务器,负责写入数据;2、容器B:端口3310,充当从服务器1,负责读取数据;3、容器B:端口3311,充当从服务器2,负责读取数据。这里主要介绍一主二从的mysql配置。
2026-03-17 16:41:32
286
原创 MySQL分库分表的实现(五)--公共表处理
::: [2033801340813910018, 0, 已启用]::: INSERT INTO t_dict (dict_id, dict_key, dict_value) VALUES (?1、在多个数据库都创建相同结构公共表。
2026-03-17 15:07:26
175
原创 MySQL分库分表的实现(四)--垂直分库
2、spring.shardingsphere.sharding.tables后面的表需指定专库里的表,主键也要随之替换为专表的主键id字段。执行上述方法,控制台显示如下,从中可以看到,该添加操作,往数据源m0的t_user表添加记录;注意:本篇博客基于在上一篇博客MySQL分库分表的实现(三)--水平分库。1、在前面的基础上添加一个新的数据源:m0,以及m0相关配置;垂直分库:根据业务模块的不同,不同的业务使用专门的数据库。1、创建user_db数据库,在里边创建t_user表。
2026-03-17 14:19:32
56
原创 MySQL分库分表的实现(二)--水平分表
本文介绍下使用Sharding-JDBC实现水平分表和水平分库Sharding-JDBC是轻量级的 java 框架,是增强版的 JDBC 驱动,使用Sharding-JDBC可以简化对分库分表之后数据相关操作。下面分别介绍下水平分表的方法。
2026-03-17 12:02:55
398
原创 MySQL分库分表的实现(一)
1、一套开源的分布式数据库中间件解决方案2、目前主要有2个产品:Sharding-JDBC 和 Sharding-Proxy3、定位为关系型数据库中间件,合理在分布式环境下使用关系型数据库操作,可用于解决使用分库分表出现的问题。其他类似产品:1. Mycat;2.Vitess,这里不作介绍。
2026-03-16 18:38:08
48
原创 Spring Bean线程安全性分析
Spring 的 Bean 是否线程安全呢,由于牵扯到因素太多,不能一概而论,因此有必要进行下总结。先说结论:Spring 的 Bean 是否线程安全,核心取决于 Bean 的作用域(Scope)和自身的状态设计,而非 Spring 框架本身 ——Spring 并不会主动为 Bean 提供线程安全保障。
2026-03-14 13:45:53
331
原创 MySQL索引的分类
核心结构:MySQL 主流索引是 B+Tree 索引,哈希索引仅适用于等值查询,全文索引适用于文本检索。存储方式:InnoDB 中主键是聚簇索引(数据和索引一体),其他索引都是非聚簇索引(需回表)。常用类型:日常开发中最常使用的是主键索引、唯一索引、普通索引和联合索引,其中联合索引需遵循 “最左匹配原则”。掌握这些分类的核心是:根据查询场景选择合适的索引类型(比如范围查询用 B+Tree 索引,文本检索用全文索引),避免滥用索引(过多索引会降低插入 / 更新效率)。
2026-03-06 11:03:40
384
原创 MySQL MVCC知识总结
核心原理:MVCC 通过隐藏列(版本标识)+ undo日志(版本链)+ Read View(可见性规则),让不同事务看到不同版本的数据;核心价值:实现 InnoDB 的 “读不阻塞写、写不阻塞读”,是高并发下 MySQL 性能的核心保障;隔离级别关联:RR 级别(默认)下,Read View 仅在事务第一次 SELECT 时生成,保证可重复读;RC 级别每次 SELECT 都生成,允许不可重复读;避坑点:长事务会导致 undo 日志堆积,需及时提交事务;
2026-03-05 19:38:46
403
原创 MyBatis-Plus的ActiveRecord 模式
1. MyBatis-Plus 的 AR 模式是实体类继承 Model 后拥有 CRUD 能力的设计模式,核心是简化单表操作代码;2. 优势是极简、直观,适合简单单表场景;劣势是不适合复杂业务,需配合 Service 层使用;3. 在日常开发中,可在用户、角色等基础表的单表操作中使用 AR 模式,减少模板代码,复杂逻辑仍保留 Service 层。
2026-03-02 10:30:03
550
原创 共享式部署和独享式部署docker容器
1. 选型核心:中小型 / 关联项目选共享式(资源省、易管理),多业务方 / 高隔离需求选独享式(加统一命名 / 脚本解决管理问题);2. 共享式关键:做好分库 / 分 DB / 分队列 + 独立账号权限,避免项目间相互影响;3. 独享式关键:通过统一命名、统一目录、批量脚本,解决多容器管理混乱的问题。如果项目有明确的隔离要求(比如对外提供的 SaaS 服务),优先独享式;如果是内部系统,共享式是更优选择。
2026-02-27 12:00:54
633
原创 Linux搭建轻量级日志系统Loki+Grafana+Promtail
一、简介LPG日志收集方案(Loki+Grafana+Promtail)LPG日志收集方案内存占用很少,经济且高效!它不像ELK日志系统那样为日志建立索引,而是为每个日志流设置一组标签。下面分别介绍下它的核心组件:• Promtail:日志收集器,有点像Filebeat,可以收集日志文件中的日志,并把收集到的数据推送到Loki中去。• Loki:聚合并存储日志数据,可以作为Grafana的数据源,为Grafana提供可视化数据。• Grafana:从Loki中获取日志信息,进行可视化展示。
2026-02-13 18:02:34
586
2
原创 Java开发中的消息通讯
Java 观察者模式是「代码层面」的解耦方案,仅适用于单进程内的消息通知,无跨进程能力;Redis 订阅机制是「轻量跨进程」的消息工具,适合低可靠性要求的实时通知,不适合核心业务;RabbitMQ 等专业 MQ是「企业级」的消息中间件,提供完善的可靠性保障,是核心业务异步解耦、削峰填谷的首选。
2026-02-05 11:21:05
611
原创 Go语言的文件操作
核心包os包是基础(打开、读写、删除、重命名),bufio适合大文件缓冲读写,替代了旧的ioutil;资源释放:打开文件后必须用释放句柄,避免资源泄漏;写入注意:缓冲写入()需要调用Flush()确保内容落地,追加写入需指定模式。
2026-02-03 15:45:23
129
原创 Go语言并发处理
goroutine是 Go 语言内置的、轻量级的执行单元,也叫「用户级线程 / 协程」,它由Go 运行时(runtime)调度,而不是操作系统内核调度。channel是 Go 语言提供的原生同步通信机制,可以理解为「goroutine 之间的管道」。让多个 goroutine 之间安全的传递数据、实现同步 / 协作通过通信来共享内存。很多人会问:Java 也有线程、Python 也有协程,Go 的并发到底好在哪?核心结论:Go 的并发不是 “锦上添花”,而是语言层面的降维打击。
2026-01-20 10:18:31
884
原创 Go语言的错误处理
当需要携带更多错误信息(如错误码、上下文)时,可以自定义实现errorimport ("fmt"// 自定义错误类型,包含错误码和错误信息Code int // 错误码Msg string // 错误信息// 实现error接口的Error()方法return fmt.Sprintf("错误码:%d,信息:%s", e.Code, e.Msg)// 模拟业务函数返回自定义错误return "", &MyError{Code: 400, Msg: "用户ID不合法"}
2026-01-18 15:07:29
363
原创 Go语言中的泛型
Go 语言的泛型(Generics)是Go 1.18 版本正式引入的核心特性,它是一种编写「与类型无关」的通用代码的能力。泛型让函数 / 结构体可以支持「任意类型」的入参 / 成员,同时保留编译期的类型安全。Go1.18 对interface接口不仅能定义方法,还能直接声明「允许的类型列表」,这种接口就是「约束接口」。// 步骤1:定义类型约束 - 允许 int、int64、float32、float64 四种数值类型// 步骤2:泛型函数使用约束 - T 必须满足 Number 约束。
2026-01-17 18:24:38
1127
原创 springboot多模块项目构建docker镜像
核心前提:Windows 必须安装(已开启),Linux 服务器必须安装(缺一不可)构建流程1、打包 SpringBoot 多模块项目;2、编写 Docker 配置 → 构建完整 Docker 镜像3、将镜像传输到;4、Linux 上一键启动 (Java+MySQL5.7+Redis 全套环境)。
2026-01-16 16:39:48
723
2
原创 Go语言的接口
接口(interface)是 Go 语言中的一种类型,用于定义行为的集合,它通过描述类型必须实现的方法,规定了类型的行为契约。Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。Go 的接口设计简单却功能强大,是实现多态和解耦的重要工具。接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。Go 的接口 = 行为的集合,关注“你能做什么”,而不是“你是谁”最重要的特点:隐式实现(无需。
2026-01-09 11:52:45
519
原创 Java使用Redis ZSet恢复用户能量
当用户进行答题,消耗一定的能量,每隔30分钟恢复一个能量值,很多时候我们会想到使用定时任务,每隔一段时间扫描有哪些用户能量低于最大能量值,然后进行恢复。但不同用户恢复能量的时间点不一样。3.如果用户开通会员,或者浏览广告恢复能量后,当该用户从能量恢复的用户体系中移除出去。前面博文使用了redis hash存储用户能量信息,本篇使用zset管理用户能量恢复。1.当用户进行答题扣除能量后,为该用户进行订阅,列入能量恢复的用户体系中;这样做的好处是避免用户能量表全表扫描。2.然后在定时任务中为用户进行能量恢复;
2026-01-08 15:40:58
409
原创 使用策略模式+装饰器模式实现接口防重复提交
RepeatSubmitStrategy(策略)Redis / 内存 / Token。提现 / 下单 / 行为记录接口。Redis / 内存都可能用。新加一个 Strategy。
2026-01-07 16:59:06
348
原创 使用docker安装myql 8.0
编辑配置文件[mysqld]# 基础配置default-authentication-plugin=mysql_native_password # 兼容旧客户端default-time_zone = '+8:00' # 中国时区lower_case_table_names=1 # 表名不区分大小写(Windows兼容)# 性能配置(基础版)skip-name-resolve # 跳过域名解析,提升连接速度[client][mysql]port=3309。
2026-01-03 16:53:26
297
原创 Java开发中VO的使用
如果只有个别字段跟前端要求不一样,为了给前端提供所需的JSON key,可以在实体类对应属性上添加注解:@JsonProperty。VO(View Object,视图对象)清楚这个边界,能有效防止各种O的滥用。这里重点说下VO的使用。那么VO 的边界在哪?不需要 VO 的情况。必须用 VO 的情况。返回结构 ≠ 表结构。表结构与返回结构一致。
2025-12-28 11:48:13
333
原创 Go语言的递归函数
递归函数函数在自己的函数体中调用自己递归 =当前问题拆成更小规模的同类问题直到一个终止条件(base case)少了终止条件,程序就会「无限套娃」直接栈溢出。n!0!= 1Go 实现return 1 // 终止条件调用f(0) = 0f(1) = 1Go 实现//1、声明return n//2、调用fmt.Println(fib(6)) // 输出8注意这个写法在 n 大时性能很差(重复计算)
2025-12-20 14:25:37
449
原创 Go语言的范围range
range是 Go 里用于遍历数据结构的语法糖...它能遍历的对象包括:数组 / 切片字符串mapchannel每次循环,range 会返回“索引/键 + 值”Go 的 range = 更安全、更简洁的 for-each,但要记住:1. 值是拷贝;2. map 无序;3. 字符串按 rune。
2025-12-18 10:34:29
374
原创 Go语言结构体
结构体是 Go 里用来组织一组不同类型字段的复合数据类型,有点像 Java 里的class没有继承没有构造函数首字母大写 = 对外可见,首字母小写 = 包内可见Id intAge intAge intu.SayHi()
2025-12-16 11:20:12
490
原创 Go 语言中的数组
项目数组 Array切片 Slice长度固定可变类型值类型引用类型内存分配整块分配指向底层数组赋值/传参拷贝整个数据拷贝指针,指向同一底层数据使用频率较低极高。
2025-12-08 17:19:58
252
原创 本地开发环境切换node导致项目启动和打包失败问题的解决
因开发需要,本地开发环境可能安装有多个node和npm版本,有时切换node版本时,比如升级到较高版本后,低版本项目再次使用npm install安装依赖、启动和打包提示错误,类似这样:npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!npm ERR!
2025-12-02 17:32:59
718
原创 Go语言的常量
Go 使用const可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。显式类型定义:隐式类型定义://多重赋值fmt.Printf("面积为:%d", area)println()执行后输出:面积为:200const (Female = 1Male = 2数字 0、1 和 2 分别代表未知性别、女性和男性。常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。
2025-12-01 11:52:01
961
空空如也
$.messager.alert()中文显示成???
2017-08-24
在前端页面格式化显示日期
2017-08-22
多文件上传文件数组不为空的判断
2017-08-19
恢复linux系统里的/bin/sh文件
2017-07-08
使用canvas绘制心电图
2017-05-06
内网怎样使用Maven管理JAVA WEB项目
2017-03-24
怎样将一个新的Web项目绑定到已备案的域名
2017-03-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅