美文网首页
springboot+dynamic-datasource实现多

springboot+dynamic-datasource实现多

作者: 梅西爱骑车 | 来源:发表于2022-09-27 19:08 被阅读0次

    本文基于baomidou的dynamic-datasource-spring-boot-starter进行Spring boot的多数据源切换。
    一、配置文件

    # 开发环境配置
    spring:
      profiles: dev
      autoconfigure:
        exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
      datasource:
        dynamic:
          druid:
            initial-size: 10
            # 初始化大小,最小,最大
            min-idle: 20
            maxActive: 500
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            testWhileIdle: true
            testOnBorrow: true
            validation-query: SELECT 1
            testOnReturn: false
            # 打开PSCache,并且指定每个连接上PSCache的大小
            poolPreparedStatements: true
            maxPoolPreparedStatementPerConnectionSize: 20
            filters: stat,wall
            filter:
              wall:
                config:
                  multi-statement-allow: true
                  none-base-statement-allow: true
                enabled: true
            # 配置DruidStatFilter
            web-stat-filter:
              enabled: true
              url-pattern: "/*"
              exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
            # 配置DruidStatViewServlet
            stat-view-servlet:
              enabled: true
              url-pattern: "/druid/*"
              # IP白名单(没有配置或者为空,则允许所有访问)
              allow: #127.0.0.1,192.168.163.1
              # IP黑名单 (存在共同时,deny优先于allow)
              deny: #192.168.1.73
              #  禁用HTML页面上的“Reset All”功能
              reset-enable: false
              # 登录名
              login-username: admin
              # 登录密码
    
              login-password: 111111
            query-timeout: 36000
          primary: master
          strict: false
          datasource:
            master:
              url: jdbc:postgresql://x.xx.xx.xx:5432/x
              username: xxxx
              password: xxxx
              driver-class-name: org.postgresql.Driver
            db1:
              url: jdbc:mysql://x.x.x.x:3306/x?useUnicode=true&characterEncoding=utf-8
              username: xx
              password: xx
              driver-class-name: com.mysql.cj.jdbc.Driver
            db2:
              url: jdbc:mysql://x.x.x.x:3306/x?useUnicode=true&characterEncoding=utf-8
              username: xx
              password: xx
              driver-class-name: com.mysql.cj.jdbc.Driver
            db3:
              url: jdbc:mysql://xx.xx.xx.xx:3306/xx?useUnicode=true&characterEncoding=utf-8
              username: xxx
              password: xxx
              driver-class-name: com.mysql.cj.jdbc.Driver
    
    

    二、使用
    默认使用master数据源,如需切换在调用查询的方法上增加@DS("数据库")

    @DS("db1")
    
    import com.baomidou.dynamic.datasource.annotation.DS;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    @Service
    public class xxxxServiceImpl implements DfsGantryTransactionService {
        @Autowired
        xxxxDao xxxxDao;
    
        @Override
        @DS("db1")
        public Listxxxx> select() {
            return xxxxDao.selectList();
        }
    }
    

    三、动态切换(建议方式)
    可以根据传入参数(配置文件配置的db1,db2,db3)动态切换数据源

    @DS("#dataBaseName")//使用spel从参数获取
    public List selectSpelByKey(String dataBaseName) {
        return userMapper.selectUsers();
    }
    
    @DS("#session.tenantName")//从session获取
        public List selectSpelBySession() {
            return userMapper.selectUsers();
        }
    
        @DS("#header.tenantName")//从header获取
        public List selectSpelByHeader() {
            return userMapper.selectUsers();
        }
    
        @DS("#tenantName")//使用spel从参数获取,即租户ID
        public List selectSpelByKey(String tenantName) {
            return userMapper.selectUsers();
        }
    
        @DS("#user.tenantName")//使用spel从复杂参数获取其某个属性
        public List selecSpelByTenant(User user) {
            return userMapper.selectUsers();
        }
    

    四、加密配置数据库账号密码

    import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            String password = "123456";
            //使用默认的publicKey ,建议还是使用下面的自定义
            String encodePassword = CryptoUtils.encrypt(password);
            System.out.println(encodePassword);
        }
    
            //自定义publicKey
        public static void main(String[] args) throws Exception {
            String[] arr = CryptoUtils.genKeyPair(512);
            System.out.println("privateKey:  " + arr[0]);
            System.out.println("publicKey:  " + arr[1]);
            System.out.println("url:  " + CryptoUtils.encrypt(arr[0], "jdbc:mysql://127.0.0.1:3306/order"));
            System.out.println("username:  " + CryptoUtils.encrypt(arr[0], "root"));
            System.out.println("password:  " + CryptoUtils.encrypt(arr[0], "123456"));
        }
    }
    

    五、手动切换数据源
    直接使用DynamicDataSourceContextHolder进行切换。

    import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
    
    @Service
    public class UserServiceImpl implements UserService {
    
      @Autowired
      private JdbcTemplate jdbcTemplate;
    
      public List selectAll() {
        DynamicDataSourceContextHolder.push("slave");//手动切换
        return  jdbcTemplate.queryForList("select * from user");
      }
     
    }
    

    相关文章

      网友评论

          本文标题:springboot+dynamic-datasource实现多

          本文链接:https://www.haomeiwen.com/subject/lbfqartx.html