xxl-job 适配达梦数据库
前言
在数字化转型的浪潮中,任务调度成为了后端服务不可或缺的一部分。XXL-JOB 是一个轻量级、分布式的任务调度框架,广泛应用于各种业务场景。达梦数据库(DM),作为一款国内领先的数据库产品,已经被越来越多的企业采用。本文将介绍如何将 XXL-JOB 适配到达梦数据库,实现任务调度的国产化支持。
Nacos 配置管理介绍
Nacos 提供了配置管理功能,支持动态配置更新,使得微服务架构中的配置管理更加灵活和高效。
达梦数据库介绍
达梦数据库是一款关系型数据库管理系统,具有高性能、高可用性、易于维护等特点,广泛应用于政府、金融、电信等行业。
环境准备
在开始之前,请确保已经准备好以下环境:
XXL-JOB:下载 XXL-JOB 的最新版本。并构建
达梦数据库:安装并启动达梦数据库。 mysql上的xxl-job库 迁移到达梦数据库上 最好使用传输工具进行传输 避免不必要用的问题
JDK:确保已安装 JDK 1.8 或以上版本。
xxl-job适配人大金仓
特此说明: 当前修改的xxl-job版本 为 2.4.1-SNAPSHOT
源码修改
pom中新增依赖 DmJdbcDriver18 驱动 注意版本
<!-- dameng -->
<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.140</version>
</dependency>
- 注释掉 原有的MySQL驱动

修改xxl-job 数据库连接以及账号密码 还有驱动类
## 注释掉原有的数据库配置
spring.datasource.url=jdbc:dm://dm连接IP:5236/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver
数据库连接 配置没问题的话 应该就可以启动了
问题汇总
Caused by: dm.jdbc.driver.DMException: 第12 行附近出现错误:无效的表或视图名[xxl_job.xxl_job_log]
com.xxl.job.admin.core.thread.JobFailMonitorHelper#start
的41行 提示 xxl_job_log 表不存在
刚开始以为也需要添加库名 ,然后尝试加了 启动依然报错
后续查询资料 是 不支持 `这个符号
解决: 全局替换 xml中的 这个符号即可
示例
<!-- 修改前 -->
<select id="findFailJobLogIds" resultType="long">SELECT idFROM `xxl_job.xxl_job_log`WHERE !((trigger_code in (0, 200)and handle_code = 0)OR(handle_code = 200))AND alarm_status = 0ORDER BY id ASCLIMIT #{pagesize}
</select>
<!-- 修改后 -->
<select id="findFailJobLogIds" resultType="long">SELECT idFROM xxl_job.xxl_job_logWHERE !((trigger_code in (0, 200)and handle_code = 0)OR(handle_code = 200))AND alarm_status = 0ORDER BY id ASCLIMIT #{pagesize}
</select>
后续 全局替换 xml中的 这个符号即可
函数 DATE ADD(unknown . interval)不存在
com.xxl.job.admin.core.thread.JobRegistryHelper#start 66行 报错
List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
提示 bad SOL grammar 错误:函数 DATE ADD(unknown . interval)不存在
Hint:没有匹配指定名称和参数类型的函数.
您也许需要增加明确的类型转换.
解决- 替换新的实现方式
查询资料说是替换 新的实现方式 尝试多次 均不可
DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND) 为
date '${nowTime}' - INTERVAL '${timeout} second'
类似的修改 等等
官方的地址说明: ’
date_add 函数若对添加时间间隔的表达式进行求值,可采用 DM 的
TIMESTAMPADD 函数进行替代,例子如下:
--MySQL
select DATE_ADD(sysdate(), INTERVAL 1 YEAR);
--2020-07-02 11:24:18
-- DM
select TIMESTAMPADD(SQL_TSI_YEAR, 1,sysdate());
--2020-07-02 11:27:56.000000
直接看终极解决办法 替换现有实现
本质来讲就是需要个工具类 将传入的时间减去一个传入的 秒数 返回修改后的时间
直接在工具类com.xxl.job.core.util.DateUtil 中 添加 如下方法
public static Date addSeconds(final Date date, final int amount) {return add(date, Calendar.SECOND, amount);
}
然后在 com.xxl.job.admin.dao.XxlJobRegistryDao 新增两个dao的方法
public List<Integer> findDeadByTime(@Param("nowTime") Date nowTime);public List<XxlJobRegistry> findAllByTime(@Param("nowTime") Date nowTime);
在mapper文件 XxlJobRegistryMapper.xml 中 新增两个方法对应的sql 内容
<select id="findDeadByTime" resultType="java.lang.Integer">SELECT <include refid="Base_Column_List" />FROM xxl_job.xxl_job_registry AS tWHERE t.update_time <![CDATA[ < ]]> #{nowTime}
</select><!-- 2024年09月12日16:26:10 新修改
注意 resultMap 是 map映射 XxlJobRegistry 而不是一个实体类
否则导致结果集部分参数获取不到-->
<select id="findAllByTime" resultMap="XxlJobRegistry">SELECT <include refid="Base_Column_List" />FROM xxl_job.xxl_job_registry AS tWHERE t.update_time > #{nowTime}
</select>
最后在 com.xxl.job.admin.core.thread.JobRegistryHelper#registryMonitorThread 文件中替换实现
//List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
//新增修改后的内容
Date beforeDate = DateUtil.addSeconds(new Date(), -1 * RegistryConfig.DEAD_TIMEOUT);
List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDeadByTime(beforeDate);
if (ids!=null && ids.size()>0) {XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
}// fresh online address (admin/executor)
HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
//List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
//新增的内容
Date nowDate = DateUtil.addSeconds(new Date(), -1 * RegistryConfig.DEAD_TIMEOUT);
List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAllByTime(nowDate);
com.xxl.job.admin.controller.JobGroupController#findRegistryByAppName 方法中 修改为使用 findAllByTime 方法
Date nowDate = DateUtil.addSeconds(new Date(), -1 * RegistryConfig.DEAD_TIMEOUT);
List<XxlJobRegistry> list = xxlJobRegistryDao.findAllByTime(nowDate);
注意事项
注意dm Caused by: dm.jdbc.driver.DMException: 第12 行附近出现错误:无效的表或视图名[xxl_job.xxl_job_log]
这个报错 不一定是这个表不存在 可能具体的位置的SQL语法有问题 导致这个报错
驱动连接问题
使用正确的驱动 或者直接去dm的安装目录下查找需要使用的版本 再使用jdk8的时候 可以使用DmJdbcDriver18

*达梦8 JDBC驱动版本说明
- DmJdbcDriver16 实现JDBC 4.0标准接口,已在JDK6上验证相关功能
- DmJdbcDriver17 实现JDBC 4.1标准接口,已在JDK7上验证相关功能
- DmJdbcDriver18 实现JDBC 4.2标准接口,已在JDK8,JDK11,JDK17上验证相关功能
good day!!!
相关文章:
xxl-job 适配达梦数据库
前言 在数字化转型的浪潮中,任务调度成为了后端服务不可或缺的一部分。XXL-JOB 是一个轻量级、分布式的任务调度框架,广泛应用于各种业务场景。达梦数据库(DM),作为一款国内领先的数据库产品,已经被越来越…...
Linux 配置与管理 SWAP(虚拟内存)
Linux 配置与管理 SWAP(虚拟内存) 一、作用二、创建交换文件(以创建一个2GB的交换文件为例)1. 创建交换文件2. 设置文件权限2.1. **关于 sudo chmod 600 /root/swapfile 是否一定要执行**2.2. **关于其他用户启动是否没权限用到交换分区** 3.…...
yolo自动化项目实例解析(七)自建UI--工具栏选项
在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…...
贝锐洋葱头浏览器随时随地访问教务系统,轻松搞定选课
教育网的“拥堵”早已是老生常谈,学生数量庞大、上网时间集中、带宽有限,导致网络速度慢。尤其是从外部网络访问教育网时,更是因为跨运营商的缘故变得缓慢。 而学校内网也是类似的情况,课余时间和上课时间的网络使用情况差别巨大…...
django drf to_internal_value
使用场景 用于将接收到的输入转换为内部可用的数据形式; 例子 to_internal_value主要在反序列化时用到,其作用处理API请求携带的数据,对其进行验证并转化为Python的数据类型。 假如我们的API客户端通过请求提交了额外的数据,比…...
map(lambda x: x[0], sorted(count.items(), key=lambda x: (-x[1], x[0]))[:n])
被解析的代码行 map(lambda x: x[0], sorted(count.items(), keylambda x: (-x[1], x[0]))[:n])假设的输入 假设我们有以下的 count 字典,其中包括一些字符串及其对应的计数: count {apple: 3,banana: 1,orange: 2,grape: 2 }1. count.items() 首先…...
灰度重心法求取图像重心
1 概述 灰度重心法(Gray-scale Center of Mass Method)是一种在图像处理和计算机视觉中常用的方法。这种方法主要用于确定图像中物体的质心或重心位置,特别是在灰度图像中。 灰度重心法的基本思想是,根据图像中每个像素的灰度值及其位置信息来计算一个加权重心,这个重心…...
Go Mail设置指南:如何提升发送邮件效率?
Go Mail使用技巧与配置教程?如何用Go Mail实现发信? 随着工作负载的增加,如何高效地发送和管理邮件成为了许多职场人士面临的挑战。AokSend将为您提供一份详细的Go Mail设置指南,帮助您提升发送邮件的效率,让您的邮件…...
kali的tplmap使用报错解决
问题 当我们直接使用kali下的tplmap时报错了。 Tplmap 0.5 Automatic Server-Side Template Injection Detection and Exploitation Tool Testing if GET parameter name is injectable Exiting: module collections has no attribute Mapping 这是因为tplmap要求的版本…...
DAY16||513.找树左下角的值 |路径总和|从中序与后序遍历序列构造二叉树
513.找树左下角的值 题目:513. 找树左下角的值 - 力扣(LeetCode) 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: […...
使用jQuery处理Ajax
使用jQuery处理Ajax HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 所有的WWW文件都必须遵守这个标准 一次HTTP操作称为一个事务&am…...
uni-app App版本更新
效果图: 前言 在移动应用开发中,确保用户能够及时更新到最新版本是非常重要的。本文将介绍如何在 uni-app 中实现 App 整包更新功能,并提供相关代码示例以帮助理解。 代码实现 2.1 引入模块 首先,我们需要引入用于处理更新的模块…...
Python Web 与低代码/无代码平台的深度融合
Python Web 与低代码/无代码平台的深度融合 目录 🚀 低代码与无代码平台的兴起🔗 Python 与低代码平台集成🌐 低代码开发的最佳实践📊 数据集成与自动化 1. 🚀 低代码与无代码平台的兴起 低代码和无代码平台的出现&…...
js 如何监听 body 内容是否改变
如果您想监听body内容的变化,并作出响应,可以使用MutationObserver。以下是一个简单的例子,它会在body内容变化时在控制台输出一条消息: // 创建一个观察者对象 const observer new MutationObserver(function(mutations, obser…...
python: 数字类型的一些函数
len(str) round(x, d) 对x进行四舍五入保留小数点后d位 round(3.45,1) 即 3.5 pow(x, y) # x的y次幂. x ** y pow(x, y[,z]) # 幂余 ( x ** y) % z print(pow(3, pow(3, 99), 10000)) #4587 浮点数…...
MapReduce学习与理解
MapReduce为google分布式三驾马车之一。分别为《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》、《Bigtable: A Distributed Storage System for Structured Data》。三遍论文奠定了分布式存储和计算的基础。本篇文章来说说mapreduc…...
Animal objDog = new Dog()和 Dog objDog = new Dog()的区别
文章目录 1、Animal objDog new Dog()和 Dog objDog new Dog()的区别1. **对象类型(引用类型)**2. **调用和可用成员**3. **示例代码来说明**使用示例总结 2、Animal objDog new Dog();不能调用dog的方法和属性是为什么?原因解析解决方法小…...
springboot引入netty
配置类 import cn.hutool.core.thread.ThreadUtil; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChanne…...
PWM基础与信号控制
1. 什么是PWM? PWM(Pulse Width Modulation,脉宽调制)是一种通过改变信号的占空比来控制电压输出的技术。简单来说,PWM信号由一系列高低电平组成,通过调节高电平持续的时间比例,可以控制信号的…...
nvm,一款nodejs版本管理工具
背景 在工作中,我们可能同时在进行2个或者多个不同的项目开发,每个项目的需求不同,进而不同项目必须依赖不同版本的NodeJS运行环境,这种情况下,对于维护多个版本的node将会是一件非常麻烦的事情,nvm就是为…...
为什么你的FastAPI AI接口在K8s里流式失败?——基于eBPF追踪的12层网络栈+ASGI生命周期时序图(含cgroup内存隔离失效证据)
第一章:FastAPI 2.0 异步 AI 流式响应对比评测报告FastAPI 2.0 原生强化了对 async/await 的深度支持,尤其在处理大语言模型(LLM)的逐 token 流式生成场景中,显著提升了吞吐量与首字节延迟(TTFB)…...
电脑系统由硬件系统和软件系统组成(来源网络,原创)
电脑系统由硬件系统和软件系统组成(来源网络,原创)电脑系统由硬件系统和软件系统组成。软件指操作硬件的各种语言或程序,硬件是指电脑系统中我们看得见、摸得着的物理设备。电脑硬件系统由运算器、控制器、存储器、输入设备和输出…...
造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用
造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用 1. 快速体验:10秒生成你的第一张AI画作 1.1 一键部署模型 在CSDN星图镜像市场找到"造相 Z-Image 文生图模型(内置模型版)v2"镜像,点…...
深入RealReachability FSM引擎:有限状态机在iOS网络检测中的终极应用指南
深入RealReachability FSM引擎:有限状态机在iOS网络检测中的终极应用指南 【免费下载链接】RealReachability We need to observe the REAL reachability of network. Thats what RealReachability do. 项目地址: https://gitcode.com/gh_mirrors/re/RealReachabi…...
深入解析BLE空口报文抓取:从GAP广播到LESC安全通信全流程
1. BLE空口报文抓取基础 想要分析BLE设备间的通信过程,抓取空口报文是最直接有效的方法。这就像在两个人对话时,用录音设备记录下他们的每一句话。不过BLE通信使用的是2.4GHz无线频段,我们无法直接用耳朵听到这些"对话",…...
零知识证明终极指南:Awesome ZKP项目快速入门教程
零知识证明终极指南:Awesome ZKP项目快速入门教程 【免费下载链接】awesome-zero-knowledge-proofs A curated list of awesome things related to learning Zero-Knowledge Proofs (ZKP). 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-zero-knowledge-p…...
STM32红外遥控器设计与多协议控制实现
基于STM32的万能红外遥控器设计与实现1. 项目概述1.1 系统架构本设计采用STM32F103RCT6作为主控芯片,构建了一个多功能红外遥控系统。系统架构包含以下核心模块:主控模块:STM32F103RCT6微控制器人机交互模块:1.44寸LCD显示屏 4x4…...
为什么92%的Polars新手在join时OOM?揭秘2.0新版streaming引擎的5个关键启用条件
第一章:Polars 2.0 大规模数据清洗技巧 面试题汇总Polars 2.0 引入了更严格的惰性执行模型、增强的字符串/时间解析能力,以及对空值传播行为的统一语义,使其在高频面试场景中成为考察候选人工程化数据处理能力的关键工具。以下为高频面试题及…...
通过爱毕业AI的智能改写功能,五个方法助你快速降低论文重复率
嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...
Qwen-Image-Edit-2509场景应用:品牌VI统一与多语言海报智能修改
Qwen-Image-Edit-2509场景应用:品牌VI统一与多语言海报智能修改 1. 品牌视觉管理的痛点与机遇 全球500强企业的设计总监们每年要面对一个共同难题:如何确保分布在50个国家的分公司,在制作本地化营销素材时,都能严格遵守总部制定…...
