当前位置:   article > 正文

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

xxl-job kingbase

前言

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

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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 注释掉 原有的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

接下来会遇到第一个问题

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

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

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

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

第二个问题
com.xxl.job.admin.core.thread.JobFailMonitorHelper#start
的41行 提示 xxl_job_log 表不存在
刚开始以为也需要添加库名 ,然后尝试加了 启动依然报错

后续查询资料 是 不支持 `这个符号
解决: 全局替换 xml中的 这个符号即可
示例

<!-- 修改前 -->
<select id="findFailJobLogIds" resultType="long">
    SELECT id
    FROM `xxl_job.xxl_job_log`
    WHERE !(
        (trigger_code in (0
        , 200)
      and handle_code = 0)
       OR
        (handle_code = 200)
        )
      AND alarm_status = 0
    ORDER BY id ASC
        LIMIT #{pagesize}
</select>
<!-- 修改后  -->
<select id="findFailJobLogIds" resultType="long">
    SELECT id
    FROM xxl_job.xxl_job_log
    WHERE !(
        (trigger_code in (0
        , 200)
      and handle_code = 0)
       OR
        (handle_code = 200)
        )
      AND alarm_status = 0
    ORDER BY id ASC
        LIMIT #{pagesize}
</select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

后续 全局替换 xml中的 这个符号即可

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

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

  • 1
  • 2

提示 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'
  • 1
  • 2

类似的修改 等等

官方的地址说明: 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);
}
  • 1
  • 2
  • 3

然后在 com.xxl.job.admin.dao.XxlJobRegistryDao 新增两个dao的方法

public List<Integer> findDeadByTime(@Param("nowTime") Date nowTime);

public List<XxlJobRegistry> findAllByTime(@Param("nowTime") Date nowTime);
  • 1
  • 2
  • 3

在mapper文件 XxlJobRegistryMapper.xml 中 新增两个方法对应的sql 内容

<select id="findDeadByTime" resultType="java.lang.Integer">
	SELECT <include refid="Base_Column_List" />
	FROM xxl_job.xxl_job_registry AS t
	WHERE 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 t
	WHERE t.update_time > #{nowTime}
</select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

最后在 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

第四个问题 最**

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
  • 1
  • 2
  • 3
  • 4
  • 5

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/933822
推荐阅读
相关标签
  

闽ICP备14008679号