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