# dynamic-datasource **Repository Path**: renyupengs/dynamic-datasource ## Basic Information - **Project Name**: dynamic-datasource - **Description**: 使用springboot整合mybatisplus的动态数据源切换,以及对定时任务框架quartz的整合案例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-11-28 - **Last Updated**: 2022-12-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: SpringBoot, mybatis-plus, quartz ## README --- --- # dynamic-datasource #### 介绍 使用springboot整合mybatisplus的动态数据源切换,以及对定时任务框架quartz的整合案例,可以运行后添加新的数据源 #### 软件架构 软件架构说明 1.动态数据源配置 ```yml spring: datasource: dynamic: primary: master strict: false datasource: master: url: jdbc:mysql://localhost:3306/dynamic-datasource?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 2.DynamicDataSource 动态数据源切换主要类 ```java @Configuration @RequiredArgsConstructor public class DynamicDataSource extends DynamicRoutingDataSource { private final DefaultDataSourceCreator defaultDataSourceCreator; public DataSource determineDataSource() { //获取当前的数据源key 为null默认走master String dsKey = DynamicDataSourceContextHolder.peek(); Map dataSources = this.getDataSources(); if (StringUtils.hasText(dsKey) && !dataSources.containsKey(dsKey)){ throw new BusinessException("501","不存在的数据源信息!"); } return this.getDataSource(dsKey); } @Override public Map getDataSources() { return super.getDataSources(); } public void setDataSources(DataSourceProperty dataSourceProperty){ //创建新的数据源 DataSource dataSource = defaultDataSourceCreator.createDataSource(dataSourceProperty); //获取本地数据源 Map dataSources = this.getDataSources(); //把添加的数据源存入本地 dataSources.put(dataSourceProperty.getPoolName(),dataSource); } } ``` 3.定时任务执行工具类QuartzUtils ```java public class QuartzUtils { /** * 创建定时任务 定时任务创建之后默认启动状态 * * @param scheduler 调度器 */ public static void createScheduleJob(Scheduler scheduler,String cron,String key,String desc) { try { // 构建定时任务信息 使用id作为任务唯一值,在执行时可以拿到。 JobDetail jobDetail = JobBuilder.newJob(DynamicTask.class).withIdentity(key).withDescription(desc).build(); // 设置定时任务执行方式 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); // 构建触发器trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(key).withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { throw new BusinessException("502","创建定时任务失败"); } } /** * 根据任务Id暂停定时任务 * * @param scheduler 调度器 * @param jobId 定时任务名称 */ public static void pauseScheduleJob(Scheduler scheduler, String jobId) { JobKey jobKey = JobKey.jobKey(jobId); try { scheduler.pauseJob(jobKey); } catch (SchedulerException e) { throw new BusinessException("503","暂停定时任务出错"); } } /** * 根据任务Id恢复定时任务 * * @param scheduler 调度器 * @param jobId 定时任务id */ public static void resumeScheduleJob(Scheduler scheduler, String jobId) { JobKey jobKey = JobKey.jobKey(jobId); try { scheduler.resumeJob(jobKey); } catch (SchedulerException e) { throw new BusinessException("504","启动定时任务出错"); } } /** * 根据任务id立即运行一次定时任务 * * @param scheduler 调度器 * @param jobId 定时任务id */ public static void runOnce(Scheduler scheduler, String jobId) { JobKey jobKey = JobKey.jobKey(jobId); try { scheduler.triggerJob(jobKey); } catch (SchedulerException e) { throw new BusinessException("504","运行定时任务出错"); } } } ```