xxl-job 适配人大金仓数据库 V8R6

前言

由于一些众所周知的原因,项目需要需要进行改造使其适配人大金仓的数据库。

xxl-job适配人大金仓

特此说明: 当前修改的xxl-job版本 为 2.4.1-SNAPSHOT

  • mysql上的xxl-job库 迁移到 人大金仓数据库上
  • pom中新增依赖 kingbase8 驱动 注意版本
    <!--KingBase-->
    <dependency><groupId>cn.com.kingbase</groupId><artifactId>kingbase8</artifactId><version>8.6.0</version>
    </dependency>
    
  • 注释掉 原有的MySQL驱动
    在这里插入图片描述
  • 修改application.properties 数据库连接以及账号密码 还有驱动类
### xxl-job, datasource
## 修改为人大金仓的 数据库协议 数据库地址 以及账号密码 
spring.datasource.url=jdbc:kingbase8://xx:xxx/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xx
spring.datasource.password=xxx
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 替换驱动为 kingbase8的驱动
spring.datasource.driver-class-name=com.kingbase8.Driver

配置没问题的话 应该就可以启动了

接下来会遇到第一个问题

com.xxl.job.admin.core.thread.JobScheduleHelper#start的 73行

                        preparedStatement = conn.prepareStatement(  "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );

提示xxl_job_lock表不存在 但是数据库里是存在的
经查阅资料发现 加上库名即可 (可能读取的datasource没有包含库名 应该是个bug)
解决: 修改为如下 增加库名

                        preparedStatement = conn.prepareStatement(  "select * from xxl_job.xxl_job_lock where lock_name = 'schedule_lock' for update" );

第二个问题
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中的 这个符号即可

第三个问题
com.xxl.job.admin.core.thread.JobRegistryHelper#start 66行 报错

							List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());

提示 bad SOL grammar [1: nested exception is
com. kinabases.util.KsoLException:错误:函数 DATE ADD(unknown . interval)不存在
Hint:没有匹配指定名称和参数类型的函数.
您也许需要增加明确的类型转换.

解决- 替换新的实现方式
查询资料说是替换 新的实现方式 尝试多次 均不可

 DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND) 为 
date '${nowTime}' - INTERVAL '${timeout} second'

类似的修改 等等

官方的地址说明: https://help.kingbase.com.cn/v8/development/sql-plsql/ref-extended-plug-in/kdb_date_function.html#id5

直接看终极解决办法 替换现有实现
本质来讲就是需要个工具类 将传入的时间减去一个传入的 秒数 返回修改后的时间

直接在工具类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><select id="findAllByTime" resultType="com.xxl.job.admin.core.model.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);

第四个问题 最**

sql语句中找不到 表 报错提示: bad SQL grammar []; nested exception is com.kingbase8.util.KSQLException: 错误: 关系 “表名” 不存在

第一个问题的解决办法适用于SQL不多的场景 要是SQL 过多 SQL改动就很大

找不到表的问题解决办法: 新建一个人大金仓的数据库账号 账号为 xxl_job 然后修改 application.properties 的数据库连接信息

spring.datasource.url=jdbc:kingbase8://xxx:54321/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxl_job
spring.datasource.password=xxxx
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.kingbase8.Driver

其他找不到的表的问题 也可参考此方案 如果项目使用到test 库 项目中使用人大金仓的数据库 提示表不存在 (确保表真的存在) 然后新建的 对应库名的账号 然后项目配置中替换用户密码配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/572372.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

充钱也不能任性,今天用百度AI又骂街了

今天在用文心一言的时候又翻车了&#xff0c;应该是又骂街了。 cao&#xff0c;充钱也不能任性啊&#xff0c;不能手贱去看百度的新功能&#xff0c;垃圾的一批。 本来付费用了用4.0&#xff0c;感觉Chat功能还是可以的&#xff0c;不论是简单的代码&#xff0c;还是一些通用的…

性价比高一点的diy台式主机怎么搭配?

怎么搭配一台性价比高一点的台式机 建议&#xff1a; 选择合适的CPU和GPU。根据实际需求选择相对较新的CPU和GPU型号&#xff0c;以确保能够运行目标应用程序和游戏。 合理选择内存和存储。根据预算选择适当的内存和存储容量。8GB或16GB内存对于一般计算和游戏使用足够了&…

由浅到深认识Java语言(31):阶段性练习

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

市场复盘总结 20240327

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 14% 最常用…

Mysql数据库命令大全

目录 mysql服务器处理客户端请求 Mysql数据库常用命令 三种删除方式&#xff1a; mysql服务器处理客户端请求 首先MySQL是典型的c/s架构&#xff0c;即client/Server架构&#xff0c;不论客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是&…

Qt C++ | QTimer经验总结

QTimer Class QTimer类提供重复计时器和单次计时器 头文件: #include <QTimer> qmake: QT += core 继承自: QObject 定时器信号 void timeout() 公共函数 Qt::TimerType 枚举定义了 Qt 中不同类型的定时器。它包含以下值: **Qt::PreciseTimer:**高精度定时器,用…

netty构建udp服务器以及发送报文到客户端客户端详细案例

目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、Ch…

App Inventor 2 实现商业级APP启动屏幕效果(SplashScreen)

启动屏幕效果 实现的功能包括&#xff1a;启动App时展示启动屏&#xff0c;右上角展示5秒倒计时&#xff0c;中途可点击跳过。倒计时结束或点击跳过&#xff0c;则跳转到主界面。效果如下&#xff1a; 实现原理 App启动屏效果的实现原理及详细步骤要点如下&#xff1a; Scree…

JVM(六)——内存模型与高效并发

内存模型与高效并发 一、java 内存模型 【java 内存模型】是 Java Memory Model&#xff08;JMM&#xff09; 简单的说&#xff0c;JMM 定义了一套在多线程读写共享数据时&#xff08;成员变量、数组&#xff09;时&#xff0c;对数据的可见性、有序 性、和原子性的规则和保障…

stable diffusion 的 GPU 不足怎么解决

稳定扩散&#xff08;stable diffusion&#xff09;是一种用于图像处理和计算机视觉任务的图像滤波算法。 当使用Stable Diffusion过程中遇到GPU显示内存不足的问题时。解决这个问题的方法有以下几种&#xff1a; 目前&#xff0c;对我来说&#xff0c;就最后一点能够暂时解决当…

dy消息监控,python协议

2024年3月27日 dy消息监控&#xff0c;协议版本&#xff0c;有wss和轮训2种方式&#xff0c;支持监听好友和群消息&#xff0c;支持消息回复&#xff0c;消息类型包括如下&#xff1a; 表情&#xff0c;文本&#xff0c;作品&#xff0c;语音&#xff0c;图片&#xff0c;视频…

ehters.js:provider

ethers.jsV5.4文档 安装ethers npm install ethers5.4.0// 引入 import { ethers } from ethersProviders /** Provider类* Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。 */ const provider new ethers.providers.Web3Provider…