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



    前言

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

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


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

    使用步骤

    1.导入maven依赖

            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druid-spring-boot-starterartifactId>
                <version>1.1.10version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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);
        }
    }
    
    • 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

    总结

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

    请添加图片描述

  • 相关阅读:
    【CNN-SVM回归预测】基于CNN-SVM实现数据回归预测附matlab代码
    如何用Python获取网页指定内容
    【Docker】Docker安装Nginx配置静态资源
    upload-Labs靶场“11-15”关通关教程
    springboot-方法处理4-消息转换器
    An Early Evaluation of GPT-4V(ision)
    【Python】给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
    C和指针 第11章 动态内存分配 11.4 使用动态分配的内存
    警告:新版Outlook会向微软发送密码、邮件和其他数据
    ubuntu18.04平台:新版OpenCV5集成算法使用mjpeg-streamer(流媒体c++库)实现视频流及网页浏览器访问
  • 原文地址:https://blog.csdn.net/Susan003/article/details/127271293