当前位置: 首页 > news >正文

基于数据库实现分布式锁

基于 Spring Boot + MyBatis + DM8 的分布式锁

project-root/
├── src/
│   └── main/
│       ├── java/com/example/demo/
│       │   ├── DemoApplication.java
│       │   ├── config/
│       │   │   └── MyBatisConfig.java
│       │   ├── entity/
│       │   │   └── ScheduledLock.java
│       │   ├── mapper/
│       │   │   └── ScheduledLockMapper.java
│       │   ├── service/
│       │   │   └── TaskLockService.java
│       │   └── task/
│       │       └── DemoScheduledTask.java
│       └── resources/
│           ├── application.yml
│           └── mapper/ScheduledLockMapper.xml
├── pom.xml// pom.xml
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dm8-task-lock-demo</artifactId><version>1.0.0</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.2.49</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-scheduling</artifactId></dependency></dependencies>
</project>// application.yml
spring:datasource:url: jdbc:dm://localhost:5236/DAMENGusername: your_userpassword: your_passworddriver-class-name: dm.jdbc.driver.DmDrivermybatis:mapper-locations: classpath*:mapper/*.xmlconfiguration:map-underscore-to-camel-case: true// entity/ScheduledLock.java
@Data
public class ScheduledLock {private String lockName;private LocalDateTime lockUntil;private LocalDateTime lockedAt;private String lockedBy;
}// mapper/ScheduledLockMapper.java
@Mapper
public interface ScheduledLockMapper {ScheduledLock selectLock(@Param("lockName") String lockName);void insertLock(ScheduledLock lock);int updateIfExpired(ScheduledLock lock);
}// mapper/ScheduledLockMapper.xml
<mapper namespace="com.example.demo.mapper.ScheduledLockMapper"><select id="selectLock" resultType="com.example.demo.entity.ScheduledLock">SELECT * FROM scheduled_lock WHERE lock_name = #{lockName}</select><insert id="insertLock">INSERT INTO scheduled_lock (lock_name, lock_until, locked_at, locked_by)VALUES (#{lockName}, #{lockUntil}, #{lockedAt}, #{lockedBy})</insert><update id="updateIfExpired">UPDATE scheduled_lockSET lock_until = #{lockUntil},locked_at = #{lockedAt},locked_by = #{lockedBy}WHERE lock_name = #{lockName} AND lock_until < SYSDATE</update>
</mapper>// service/TaskLockService.java
@Service
public class TaskLockService {@Autowired ScheduledLockMapper mapper;private final String instanceId = InetAddress.getLocalHost().getHostName();public boolean tryLock(String lockName, Duration holdTime) {LocalDateTime now = LocalDateTime.now();LocalDateTime until = now.plus(holdTime);ScheduledLock lock = new ScheduledLock();lock.setLockName(lockName);lock.setLockUntil(until);lock.setLockedAt(now);lock.setLockedBy(instanceId);int updated = mapper.updateIfExpired(lock);if (updated > 0) return true;ScheduledLock existing = mapper.selectLock(lockName);if (existing == null) {mapper.insertLock(lock);return true;}return instanceId.equals(existing.getLockedBy()) && existing.getLockUntil().isAfter(now);}
}// task/DemoScheduledTask.java
@Slf4j
@Component
public class DemoScheduledTask {@Autowired TaskLockService lockService;@Scheduled(cron = "0 */1 * * * ?")public void runClusterSingletonTask() {if (!lockService.tryLock("demo-task", Duration.ofMinutes(2))) {log.info("跳过任务,本机未抢到锁");return;}log.info("本机获得锁,执行定时任务");// 执行任务逻辑}
}// SQL 建表
CREATE TABLE scheduled_lock (lock_name VARCHAR(100) PRIMARY KEY,lock_until TIMESTAMP,locked_at TIMESTAMP,locked_by VARCHAR(100)
);

特点:

  • 支持多实例部署,只有一台机器能执行任务

  • 使用达梦数据库做分布式锁,自动过期无需手动释放

  • 基于 MyBatis,简单清晰,易于扩展

  • 配置友好,完全可运行、可集成

包含模块:

  • scheduled_lock 建表 SQL

  • 实体类 + Mapper + XML + Service

  • 一个最小定时任务示例(每分钟执行一次)

  • YML 配置连接 DM8

http://www.hskmm.com/?act=detail&tid=38243

相关文章:

  • 2025.10.24第一节课内容
  • 2025 年国内磁吸盘源头厂家最新推荐排行榜:聚焦电永 / 焊接电 / 电控永 / 起重电 / 液压潜水电等品类实力企业
  • 监督学习、无监督学习、半监督学习、强化学习、自监督学习
  • 2025 年退磁器生产厂家最新推荐榜:技术创新、行业适配与服务保障全景对比及权威测评结果强力退磁器/手提退磁器/小型退磁器公司推荐
  • word批量转pdf
  • 【IEEE出版 | 高届数会议 | 上届已于会后3个多月完成见刊检索】2025第九届控制工程与国际论坛(IWCEAA 2025)
  • SQLServer截取字符串、字符串长度、特殊字符在字符串的下标索引
  • 题解:P8134 [ICPC 2020 WF] Opportunity Cost
  • 解决Qt 不能debug问题
  • 2025年项目总延期?这30款项目进度管理软件让我提前交付率85%!
  • 2025 年最新护眼灯生产厂家推荐榜:含全光谱智能照明标杆企业及高产能品牌优选指南自然光护眼/全光谱护眼/儿童护眼吸顶灯公司推荐
  • Java多线程梳理
  • QT的事件循环(一)
  • 【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案
  • QT中的反射机制
  • Exadata数据库性能异常,备份进程卡住
  • [linux] 文件夹可写权限的关闭和打开
  • 熟知大模型中mcp概念 --by zk
  • 2025年一体化雨水提升泵站厂家权威推荐榜单:污水提升泵站/一体化污水泵站/一体化雨水泵站源头厂家精选
  • 【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制
  • 2025年教室护眼灯厂家权威推荐榜单:led教室灯/幼儿园教室灯/教室照明灯具源头厂家精选
  • 2025年自动定量灌装机厂家权威推荐榜单:称重灌装机/膏状灌装机/瓶灌装机源头厂家精选
  • 厨房电子秤芯片方案:SIC8833
  • 备份恢复:backup database format plus archivelog归档备份集路径与数据库format指定不一致
  • 在MCUXpresso IDE中建立使用静态库的工程 - 指南
  • 从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
  • 深入理解Java线程
  • 2025年江苏博士后微服务公司权威推荐榜单:博士后服务团/高层次人才服务/高层次人才引进源头公司精选
  • RFSOC学习记录(六)混频模式分析
  • OSI七层网络参考模型(Leo)