Springboot项目配置多数据源,然后任意切换
数据库信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
启动类设置
1 2 3 4 5 6 7 8 | @SpringBootApplication (exclude = { DataSourceAutoConfiguration. class }) public class XxlJobAdminApplication { public static void main(String[] args) { SpringApplication.run(XxlJobAdminApplication. class , args); } } |
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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(); } } |
1 2 | 这里切换数据源 DBMigrationContext.setCurrentDs(DBMigrationContext.NEW_DS_KEY); |
标签:
mysql
, springboot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!