【Springboot】动态配置数据源,系统自动辨认服务端与本地端数据源

2年前Python源码13516
【Springboot】动态配置数据源,系统自动辨认服务端与本地端数据源 来自上海的这位朋友 于2022-10-12 11:10:24发布 3969 收藏 101 分类专栏: Java知识 文章标签: spring boot java spring Java知识 专栏收录该内容 18 篇文章 0 订阅 订阅专栏

系统自动辨认服务端与本地端数据源 前言使用步骤1.导入maven依赖2.启动类配置3.yml配置文件4.继承AbstractRoutingDataSource5.编写数据源配置 总结


前言

提示:这里可以添加本文要记录的大概内容:

本文中主要讲解,不同数据源,系统如何自动辨认本地端和服务端,并灵活的切换,不需要写拦截器,在项目启动的时候就根据当前系统自动配置


提示:以下是本篇文章正文内容,下面案例可供参考

使用步骤 1.导入maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> 2.启动类配置 @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) @Import({DynamicDataSourceConfig.class}) @MapperScan(basePackages = "com.view.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 3.yml配置文件 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: # 本地数据源 local: url: jdbc:mysql://localhost:3306/localDB?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 username: xxxx1 password: xxxx2 driverClassName: com.mysql.cj.jdbc.Driver #服务端数据源 prod: url: jdbc:mysql://localhost:3306/serverDB?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 username: xxxx1 password: xxxx2 driverClassName: com.mysql.cj.jdbc.Driver 4.继承AbstractRoutingDataSource public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { return getDataSource(); } public static String getDataSource() { return contextHolder.get(); } } 5.编写数据源配置

主要使用了 System.getProperty(“os.name”) 在Windows环境下面 会输出 Windows10 在Linux环境下也是服务端 会输出Linux 利用这个机制,我们在不同环境下使用不同的数据源

@Configuration @Component public class DynamicDataSourceConfig { public static final Map<String,String> systemMap = new HashMap<>(); public Map<String,String> getSystemMap(){ // 如果是Linux端 则使用prod数据源 systemMap.put("linux","prod"); // 如果是Windows端 则使用local数据源 systemMap.put("windows","local"); return systemMap; } public DataSource getDataSource(Map<Object, Object> targetDataSources,DataSource localDataSource, DataSource prodDataSource){ String sysName = System.getProperty("os.name").toLowerCase(); for (Map.Entry<String, String> entry : getSystemMap().entrySet()) { if (sysName.contains(entry.getKey().toLowerCase())){ switch (entry.getKey()){ case "linux": targetDataSources.put(entry.getValue(),prodDataSource); return prodDataSource; case "windows": targetDataSources.put(entry.getValue(),localDataSource); return localDataSource; } } } return null; } @Bean @ConfigurationProperties("spring.datasource.druid.local") public DataSource localDataSource(){ return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.druid.prod") public DataSource prodDataSource(){ return DruidDataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dataSource(DataSource localDataSource, DataSource prodDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); DataSource dataSource = getDataSource(targetDataSources, localDataSource, prodDataSource); if (dataSource != null) { return new DynamicDataSource(dataSource, targetDataSources); } return new DynamicDataSource(localDataSource, targetDataSources); } }
总结 根据当前不同的系统环境可以区别不同的一个数据源使用,我们可以当Windows环境就是本地环境,而Linux环境就是线上环境,通过System.getProperty(“os.name”);来进行区分,我们也可以通过System.getProperty(“os.version”); 获取当前系统版本号来进行区分

相关文章

牛客网之SQL刷题练习——一个实用的网站

牛客网之SQL刷题练习——一个实用的网站...

Transformer:注意力机制(attention)和自注意力机制(self-attention)的学习总结

Transformer:注意力机制(attention)和自注意力机制(self-attention)的学习总结...

Redis实现分布式锁

Redis实现分布式锁...

【C++修炼之路】6. 内存管理

【C++修炼之路】6. 内存管理...

Ubuntu20.04安装详细图文教程(双系统)

Ubuntu20.04安装详细图文教程(双系统)...

ES常见查询示例

ES常见查询示例...