【Springboot】动态配置数据源,系统自动辨认服务端与本地端数据源
【Springboot】动态配置数据源,系统自动辨认服务端与本地端数据源
来自上海的这位朋友
于2022-10-12 11:10:24发布
3969
收藏
101
分类专栏:
Java知识
文章标签:
spring boot
java
spring
Java知识
专栏收录该内容
18 篇文章
0 订阅
订阅专栏
系统自动辨认服务端与本地端数据源
前言使用步骤1.导入maven依赖2.启动类配置3.yml配置文件4.继承AbstractRoutingDataSource5.编写数据源配置
总结
前言
总结 根据当前不同的系统环境可以区别不同的一个数据源使用,我们可以当Windows环境就是本地环境,而Linux环境就是线上环境,通过System.getProperty(“os.name”);来进行区分,我们也可以通过System.getProperty(“os.version”); 获取当前系统版本号来进行区分
前言
提示:这里可以添加本文要记录的大概内容:
本文中主要讲解,不同数据源,系统如何自动辨认本地端和服务端,并灵活的切换,不需要写拦截器,在项目启动的时候就根据当前系统自动配置
提示:以下是本篇文章正文内容,下面案例可供参考
使用步骤 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”); 获取当前系统版本号来进行区分