XXL-Job如何适配PostgreSQL数据库?

发表时间: 2021-04-08 06:49

背景

开源任务调度框架 XXL-Job 默认是基于 MySQL 数据库开发的,好在它是使用了 MyBatis ,要支持其他数据库,需要改 Mapping 映射文件,建表语句换成其他数据库的。

主要差异表现在四个方面:

  1. 建表语句中的主键自增
  2. Mapping 中的转义符号
  3. 分页查询语句
  4. 时间函数

本文介绍 XXL-Job 连接 Postgre 数据库的改造过程。

数据发送

第一步,将官方提供的 MySQL 建表语句通过 Navicat 导入 MySQL ,这样可以保证对应版本的建表语句的一致性。

第二步,选中 MySQL 连接下的 xxl-job 数据库,右键“数据传输” ,使用 Navicat 的数据传输功能,将 xxl-job 数据库的表结构传输给对应的 Postgre 连接:


等待完成,这个数据传输会完成创建 SEQUENCE 和表以及基础数据插入的工作,
但是不会为自增主键设置默认值

第三步,在 Postgre 连接下对应的数据库中,创建查询语句,修改所有用到自增主键的表,设置 default 值为自增。

ALTER TABLE "public"."xxl_job_user" alter column ID set default nextval('xxl_job_user_id_seq'::regclass);ALTER TABLE "public"."xxl_job_info" alter column ID set default nextval('xxl_job_info_id_seq'::regclass);ALTER TABLE "public"."xxl_job_log" alter column ID set default nextval('xxl_job_log_id_seq'::regclass);ALTER TABLE "public"."xxl_job_log_report" alter column ID set default nextval('xxl_job_log_report_id_seq'::regclass);ALTER TABLE "public"."xxl_job_logglue" alter column ID set default nextval('xxl_job_logglue_id_seq'::regclass);ALTER TABLE "public"."xxl_job_registry" alter column ID set default nextval('xxl_job_registry_id_seq'::regclass);ALTER TABLE "public"."xxl_job_group" alter column ID set default nextval('xxl_job_group_id_seq'::regclass);

第四步,进入 Postgre 数据库中,右键设计每个表,对 int 类型且 Not Null 的字段设置默认值为 0 。这一步非常关键,因为日志表有几个字段入库时未传值,轮询后更新的,没有默认值,插入 SQL 无法通过 Not Null 的检查而异常。

MyBatisMapping 调整

到 mybatis-mapper 文件夹下,修改各个 Mapper 文件,使其适配 Postgre 语法,主要有三个地方:

  1. 去掉转义符 ` ,直接用空格替换
  2. 修改 LIMIT #{offset}, #{pagesize}LIMIT #{pagesize} OFFSET #{offset} ,涉及到查询的地方都需要调整
  3. 时间函数,如:XxlJobRegistryMapper.xml 文件中 findAllfindDead 查询语句,DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND) 修改为 ((select NOW())-INTERVAL '${timeout} S')

数据库连接配置

第一步,pom.xml 中添加 Postgre 驱动,maven 官网找最一个较高的版本。

<dependency>			<groupId>org.postgresql</groupId>			<artifactId>postgresql</artifactId>			<version>42.2.19</version>		</dependency>

第二步,修改 admin 模块下的 application.properties 文件,数据库连接配置信息改为 Postgrel 。

### xxl-job, datasourcespring.datasource.url=jdbc:postgresql://IP:5432/xxl-jobspring.datasource.username=usernamespring.datasource.password=passwordspring.datasource.driver-class-name=org.postgresql.Driver

检查一遍所有的配置,然后在本机直接启动测试。

启示录

本来以为这个开源框架应该是支持所有类型数据库的额呢,验证其他数据库的适配情况时,才发现官网 doc 目录下数据库只有一个 MySQL ,看 issues 说适配需要自己改 mapper 映射文件。

好在它不像 Azkaban 那样把 SQL 集成在代码中,所以就自己改造一下,还是比较顺利的,汇总称此文,希望给需要改造的同行一点启发!