dophinescheduler standalone没办法使用mysql

背景

dophinescheduler是一款开源的分布式调度系统,它的设计初衷是为了解决大规模任务调度的需求。然而,在某些场景下,我们可能希望使用dophinescheduler standalone模式,并且将其数据存储在MySQL数据库中。但是,dophinescheduler standalone默认并不支持MySQL数据库,这给一些用户带来了困扰。

原因分析

dophinescheduler standalone默认使用的是H2数据库,这是一款基于Java的内存数据库。它的设计目标是为了提供一个快速、开源、可嵌入的数据库解决方案。相比之下,MySQL是一款功能强大的关系型数据库,被广泛应用于各个领域。

然而,dophinescheduler standalone并不直接支持MySQL数据库的原因是,MySQL与H2的语法、特性以及数据类型有所差异。将dophinescheduler standalone迁移到MySQL可能需要进行一些适配和改造工作。

解决方案

要让dophinescheduler standalone支持MySQL数据库,我们可以通过修改dophinescheduler的配置文件并进行相关的代码改造来实现。

修改配置文件

首先,我们需要修改dophinescheduler的配置文件,以指定使用MySQL数据库。打开conf/application.properties文件,在其中添加以下配置:

# 数据源类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# MySQL连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/dophinescheduler?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 数据库方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect

上述配置将使用阿里巴巴的Druid连接池来管理MySQL连接,同时指定了数据库连接的URL、用户名、密码以及驱动类。

代码改造

除了配置文件的修改之外,我们还需要对dophinescheduler的代码进行改造,以适配MySQL数据库。具体而言,我们需要进行以下几个方面的改动:

1. 数据库方言

打开com.dophin.scheduler.core.dao包下的HibernateDaoImpl文件,在文件开头添加注解,指定使用MySQL的方言:

import org.hibernate.dialect.MySQL57Dialect;

@javax.persistence.Entity
@javax.persistence.Table(name = "t_ds_job")
@org.hibernate.annotations.Table(appliesTo = "t_ds_job", comment = "任务信息表")
@org.hibernate.annotations.DynamicUpdate
@org.hibernate.annotations.DynamicInsert
@org.hibernate.annotations.OptimisticLocking(type = OptimisticLockType.VERSION)
@org.hibernate.annotations.SQLDelete(sql = "update t_ds_job set flag = 0 where id = ? and version = ? ")
@org.hibernate.annotations.Where(clause = "flag = 1")
@javax.persistence.NamedQueries({
        @javax.persistence.NamedQuery(name = "findById", query = "from Job where id = ?"),
        ...
})
public class Job implements Serializable {

    ...
    
    @Override
    public boolean equals(Object o) {
        ...
    }
    
    ...
    
    @Override
    public int hashCode() {
        ...
    }
    
    ...
}
2. 数据库连接

打开com.dophin.scheduler.core.datasource.ConnectionFactory文件,修改连接数据库的方法,将原来的H2连接改为MySQL连接:

import com.alibaba.druid.pool.DruidDataSource;

public class ConnectionFactory {

    private static final Logger logger = LogManager.getLogger(ConnectionFactory.class);

    private static DataSource dataSource;

    private static Properties properties;

    public static synchronized DataSource getDataSource() {
        if (dataSource == null) {
            dataSource = createDataSource();
        }
        return dataSource;
    }

    private static synchronized DataSource createDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(properties.getProperty("driver"));
        druidDataSource.setUrl(properties.getProperty("url"));
        druidDataSource.setUsername(properties.getProperty("username"));
        druidDataSource.setPassword(properties.getProperty("password"));
        return druidDataSource;
    }

    ...
}
3. 数据库初始化

打开com.dophin.scheduler.core.datasource.ConnectionFactory文件,修改数据库初始化的方法,将原来的H2数据库初始化改为MySQL数据库初始化:

import org.apache.ibatis.jdbc.ScriptRunner;

public class ConnectionFactory {

    ...

    private static synchronized void initDatabase() {
        try (Connection connection = dataSource