为热门项⽬若依(ruoyi)添加flyway,⾃动管理数据库版本
flyway⼤家应该都听说过甚⾄⽤过,是⼀种数据库管理⼯具。多个⼈协作开发,或者是项⽬部署的时候,⾮常⽅便,不需要再mysql ⾥⾯去初始化表结构和数据,项⽬启动时,根据flyway_schema_history表中的历史数据,动态的更新数据库。
则是⼀个⾮常优秀的开源系统,⽀持代码⾃动⽣成,同时发布了三个版本可供选择。部分框架其实有待更新,后续空闲了会继续将其依赖升级的更新的版本,有兴趣的朋友可以关注。今天主要是为前后端分离项⽬继承flyway,实现数据库⾃动管理,项⽬迁移部署啥的也更加⽅便。
1. 添加依赖
在ruoyi-admin这个module⾥⾯添加flyway依赖
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
2. 配置flyway
在ruoyi-admin这个module的application-druid.properites⽂件中添加如下配置
spring:
# 配置flyway数据版本管理
flyway:
enabled: true
baseline-on-migrate: true
clean-on-validation-error: false
sql-migration-prefix: V
sql-migration-suffixes: .sql
locations: classpath:db/migration
3. 配置sql脚本
在原项⽬中的sql⽬录下有两个初始化sql脚本,读者通过⾃⼰创建数据库,运⾏脚本,初始化表和数据,再启动前后端项⽬是完全没有问题的。
在ruoyi-admin的resource⽬录下创建db/migration⽬录,使⽤idea的朋友这⾥要特别特别注意,⼀不⼩⼼就报错了,先看下图。
看着是不是像有两个同名的⽂件夹,但这肯定是不被允许的,我们打开windows的资源管理器,到对应的⽬录查看⼀下。
事情果然没有那么简单,在创建⽬录的时候,我们⼤多数⼈肯定是习惯⽤.号隔离多个⽬录,因为我们创建java⽂件就是这么做的,如果只是创建⼀个⽬录,携程db.migration,idea默认创建的是⼀个名为db.migration的⽬录,所以最后分两次创建。
在/db/migration/⽬录下,我们把原项⽬提供的两个sql脚本复制粘贴过来,并重命名为如下格式。
⼤V开头,后⾯跟版本号,⽤两根下划线隔开,后⾯接版本描述,.sql结尾。
⼀般项⽬进⾏到这⾥,flyway配置就完成了,不过ruoyi-vue到这⾥启动的话,还是会报错,主要是有三个地⽅⽤到了
@PostConstruct注解,系统需要从数据库中加载配置信息,并且是构造bean后就执⾏,此时flaway的数据库配置加载还没执⾏,如果是第⼀次执⾏项⽬的话,数据库都还没有表结构信息,所以会报错。
此时可以考虑重写flyway⾃动配置,通过@Bean的⽅式添加,不采⽤默认的⾃动化配置,控制表信息的加载时机。更⽅便的,直接改这三个地⽅的加载时机就⾏了。
⾸先,注销掉三个地⽅的配置加载。
ruoyi-system中com.ruoyi.system.service.impl.SysConfigServiceImpl的redis参数缓存配置
ruoyi-system中com.ruoyi.system.service.impl.SysDictTypeServiceImpl的字典信息缓存配置
ruoyi-quartz中com.ruoyi.quartz.service.impl.SysJobServiceImpl的定时任务配置
在ruoyi-system中新增⼀个配置类com.fig.RuntimeConfig,内容如下,在项⽬加载完成后再执⾏这些参数的缓存配置。
@Component
public class RuntimeConfig implements ApplicationListener<ContextRefreshedEvent>{
private final static Logger LOGGER = Logger(RuntimeConfig.class);
@Autowired
private SysConfigMapper configMapper;
@Autowired
private RedisCache redisCache;
@Autowired
private SysDictTypeMapper dictTypeMapper;
@Autowired
private SysDictDataMapper dictDataMapper;
@Autowired
private Scheduler scheduler;resource和autowired注解的区别
@Autowired
private SysJobMapper jobMapper;
/**
* 项⽬启动时,初始化参数
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){
LOGGER.info("init redis ...");
this.initRedis();
LOGGER.info("init dict ...");
this.initDict();
try{
LOGGER.info("init job ...");
this.initJob();
}catch(SchedulerException e){
e.printStackTrace();
}catch(TaskException e){
e.printStackTrace();
}
}
/**
* 初始化定时任务信息到缓存
*
* @throws SchedulerException
* @throws TaskException
*/
public void initJob()throws SchedulerException, TaskException {
scheduler.clear();
List<SysJob> jobList = jobMapper.selectJobAll();
for(SysJob job : jobList){
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论