0


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

系统自动辨认服务端与本地端数据源


前言

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

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


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

使用步骤

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")publicclassApplication{publicstaticvoidmain(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-8username: xxxx1
        password: xxxx2
        driverClassName: com.mysql.cj.jdbc.Driver
        #服务端数据源prod:url: jdbc:mysql://localhost:3306/serverDB?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8username: xxxx1
        password: xxxx2
        driverClassName: com.mysql.cj.jdbc.Driver

4.继承AbstractRoutingDataSource

publicclassDynamicDataSourceextendsAbstractRoutingDataSource{privatestaticfinalThreadLocal<String> contextHolder =newThreadLocal<>();publicDynamicDataSource(DataSource defaultTargetDataSource,Map<Object,Object> targetDataSources){super.setDefaultTargetDataSource(defaultTargetDataSource);super.setTargetDataSources(targetDataSources);super.afterPropertiesSet();}@OverrideprotectedObjectdetermineCurrentLookupKey(){returngetDataSource();}publicstaticStringgetDataSource(){return contextHolder.get();}}

5.编写数据源配置

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

@Configuration@ComponentpublicclassDynamicDataSourceConfig{publicstaticfinalMap<String,String> systemMap =newHashMap<>();publicMap<String,String>getSystemMap(){// 如果是Linux端 则使用prod数据源
        systemMap.put("linux","prod");// 如果是Windows端 则使用local数据源
        systemMap.put("windows","local");return systemMap;}publicDataSourcegetDataSource(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;}}}returnnull;}@Bean@ConfigurationProperties("spring.datasource.druid.local")publicDataSourcelocalDataSource(){returnDruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties("spring.datasource.druid.prod")publicDataSourceprodDataSource(){returnDruidDataSourceBuilder.create().build();}@Bean@PrimarypublicDynamicDataSourcedataSource(DataSource localDataSource,DataSource prodDataSource){Map<Object,Object> targetDataSources =newHashMap<>();DataSource dataSource =getDataSource(targetDataSources, localDataSource, prodDataSource);if(dataSource !=null){returnnewDynamicDataSource(dataSource, targetDataSources);}returnnewDynamicDataSource(localDataSource, targetDataSources);}}

总结

  1. 根据当前不同的系统环境可以区别不同的一个数据源使用,我们可以当Windows环境就是本地环境,而Linux环境就是线上环境,
  2. 通过System.getProperty(“os.name”);来进行区分,我们也可以通过System.getProperty(“os.version”); 获取当前系统版本号来进行区分

请添加图片描述

标签: spring boot java spring

本文转载自: https://blog.csdn.net/Susan003/article/details/127271293
版权归原作者 来自上海的这位朋友 所有, 如有侵权,请联系我们删除。

“【Springboot】动态配置数据源,系统自动辨认服务端与本地端数据源”的评论:

还没有评论