Springboot项目配置多数据源,然后任意切换
数据库信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job_test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.second.url=jdbc:mysql://127.0.0.1:3306/dynamic02?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.second.username=root spring.datasource.second.password=root spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver ### datasource-pool spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.maximum-pool-size=30 spring.datasource.hikari.auto-commit=true spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.pool-name=HikariCP spring.datasource.hikari.max-lifetime=900000 spring.datasource.hikari.connection-timeout=10000 spring.datasource.hikari.connection-test-query=SELECT 1 spring.datasource.hikari.validation-timeout=1000
启动类设置
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class XxlJobAdminApplication {
public static void main(String[] args) {
SpringApplication.run(XxlJobAdminApplication.class, args);
}
}
配置类
package com.xxl.job.admin.core.conf;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DataSourceConfig {
@Value("${spring.datasource.driverClassName}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String userName;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.second.url}")
private String secondUrl;
@Value("${spring.datasource.second.username}")
private String secondUserName;
@Value("${spring.datasource.second.password}")
private String secondPassword;
@Value("${spring.datasource.hikari.minimum-idle}")
private int minimumIdle;
@Value("${spring.datasource.hikari.maximum-pool-size}")
private int maxPoolSize;
@Value("${spring.datasource.hikari.auto-commit}")
private boolean isAutoCommit;
@Value("${spring.datasource.hikari.idle-timeout}")
private int minIdleTimeOut;
@Value("${spring.datasource.hikari.pool-name}")
private String poolName;
@Value("${spring.datasource.hikari.max-lifetime}")
private long maxLifetime;
@Value("${spring.datasource.hikari.connection-timeout}")
private long conectionTimeOut;
@Value("${spring.datasource.hikari.connection-test-query}")
private String connectionTestQuery;
@Value("${spring.datasource.hikari.validation-timeout}")
private long validationTimeout;
@Bean("old_ds")
public DataSource oldDataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
config.setJdbcUrl(url);
config.setUsername(userName);
config.setPassword(password);
config.setMinimumIdle(minimumIdle);
config.setMaximumPoolSize(maxPoolSize);
config.setAutoCommit(isAutoCommit);
config.setIdleTimeout(minIdleTimeOut);
config.setPoolName(poolName);
config.setMaxLifetime(maxLifetime);
config.setConnectionTimeout(conectionTimeOut);
config.setConnectionTestQuery(connectionTestQuery);
config.setValidationTimeout(validationTimeout);
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
private DataSource newDataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
config.setJdbcUrl(secondUrl);
config.setUsername(secondUserName);
config.setPassword(secondPassword);
config.setMinimumIdle(minimumIdle);
config.setMaximumPoolSize(maxPoolSize);
config.setAutoCommit(isAutoCommit);
config.setIdleTimeout(minIdleTimeOut);
config.setPoolName(poolName);
config.setMaxLifetime(maxLifetime);
config.setConnectionTimeout(conectionTimeOut);
config.setConnectionTestQuery(connectionTestQuery);
config.setValidationTimeout(validationTimeout);
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
/**
* 设置动态数据源为主数据源
*
* @return
*/
@Bean
@Primary
public DataSource dataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DBMigrationContext.OLD_DS_KEY, oldDataSource());
targetDataSources.put(DBMigrationContext.NEW_DS_KEY, newDataSource());
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.afterPropertiesSet();
return dynamicDataSource;
}
}
package com.xxl.job.admin.core.conf;
public class DBMigrationContext {
public static final String OLD_DS_KEY = "old_ds";
public static final String NEW_DS_KEY = "new_ds";
private static volatile String CURRENT_DS = OLD_DS_KEY;
public static String getCurrentDs() {
return CURRENT_DS;
}
public static void setCurrentDs(String currentDs) {
CURRENT_DS = currentDs;
}
}
package com.xxl.job.admin.core.conf;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* @Description:
* @Author: 喵星人
* @Create: 2023/12/4 9:50
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DBMigrationContext.getCurrentDs();
}
}
package com.xxl.job.admin.core.scheduler;
import com.xxl.job.admin.core.thread.JobDatasourceSwitchHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @Description:
* @Author: 喵星人
* @Create: 2023/12/11 13:56
*/
@Component
public class XxlDataSourceSwitvhScheduler {
@Autowired
private Environment environment;
@PostConstruct
public void init() throws Exception {
new JobDatasourceSwitchHelper(environment.getProperty("datasource.switch.start.time"),environment.getProperty("datasource.switch.between.time")).start();
}
}
这里切换数据源 DBMigrationContext.setCurrentDs(DBMigrationContext.NEW_DS_KEY);
浙公网安备 33010602011771号