最近更新:2020年7月21日

1.介绍

当系统不满足只是一个数据源的时候,还有一部门业务需要设计到其他的数据库的时候,去修改驱动,配置文件,重启系统会很麻烦,不易于部署实施,本文以Mysql和Oracle两种数据源不同切换介绍了基于@RefreshScope注解和Nacos配置的方式就可以达到不需要去修改代码,灵活切换不同数据源操作。

2.RefreshScope注解介绍

  1. 当有方法或者在类上添加@RefreshScope,Spring在初始化Bean的时候会使该Bean加载为惰性代理,使bean不一下加入到IOC容器当中,而是一个代理加入,在使用时(即,在调用方法时)才会进行初始化,并且作用域充当初始化值的缓存。要强制Bean在下一个方法调用上重新初始化,它有一个它有一个公共的方法 refreshAll()通过清除目标缓存刷新范围内的所有Bean。还有refresh(String)一种通过名称刷新单个bean 的方法。而Nacos本身会监听配置文件里面的内容,一旦配置文件被更改,那么就会刷新从配置文件里读取到的新内容,从而去刷新销毁上一个连接池,重新创建初始化连接池,达到动态切换数据源操作

    3.依赖管理

    以Mysql和Oracle两种数据源为示例切换,如有需要可另外添加,实现方式都是一样
    1. <!-- Mysql驱动-->
    2. <dependency>
    3. <groupId>mysql</groupId>
    4. <artifactId>mysql-connector-java</artifactId>
    5. </dependency>
    6. <!-- Oracle驱动-->
    7. <dependency>
    8. <groupId>com.oracle</groupId>
    9. <artifactId>ojdbc6</artifactId>
    10. <version>11.2.0.4.0-atlassian-hosted</version>
    11. </dependency>

    3.1完整项目依赖

    ```xml
    1. <artifactId>spring-cloud-highzap-dependencies</artifactId>
    2. <groupId>com.highzap.cloud</groupId>
    3. <version>1.0.0-SNAPSHOT</version>
    4. <relativePath/>
    com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config org.springframework.boot spring-boot-starter-actuator mysql mysql-connector-java com.oracle ojdbc6 11.2.0.4.0-atlassian-hosted
  1. <a name="x4EPP"></a>
  2. ## 4.配置文件
  3. 配置文件分为本地配置文件和Nacos配置中心配置文件,本文介绍的是从本地配置文件去读取Nacos配置中心远端读取动态配置文件来加载,实现动态切换
  4. <a name="5AF3F"></a>
  5. ### 4.1本地配置文件
  6. ```yaml
  7. spring:
  8. application:
  9. name: zap-orgmanagement-service
  10. cloud:
  11. nacos:
  12. config:
  13. server-addr: 127.0.0.1:8848
  14. file-extension: yml
  15. profiles:
  16. active: wangl-test
  17. management:
  18. endpoints:
  19. web:
  20. exposure:
  21. include: refresh,health
  22. enabled-by-default: true

4.2Nacos配置中心配置文件

本文使用的是读取Nacos配置文件中的连接字符串,配合@RefreshScope注解实现代码注入数据源,通过Nacos动态加载配置实现切换不同数据源

  1. server:
  2. # 端口号
  3. port: 8082
  4. spring:
  5. application:
  6. # 应用名称
  7. name: zap-orgmanagement-service
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: 127.0.0.1:8848
  12. #配置自定义连接字符串
  13. # Oracle连接字符串
  14. # dbUrl: jdbc:oracle:thin:@demo.highzap.com:1521:zapsoft
  15. # username: zapsoftuser
  16. # password: zapsoftuser!123
  17. # driverClassName: oracle.jdbc.driver.OracleDriver
  18. # Mysql连接字符串
  19. dbUrl: jdbc:mysql://127.0.0.1:3306/org?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
  20. username: root
  21. password: root
  22. driverClassName: com.mysql.cj.jdbc.Driver
  23. # mybatis-plus配置
  24. mybatis-plus:
  25. mapper-locations: classpath:mapper/*Mapper.xml
  26. configuration:
  27. # 控制台打印SQL语句
  28. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  29. global-config:
  30. db-config:
  31. #数据库ID自增"
  32. id-type: none
  33. #数据库大写下划线转换
  34. capital-mode: false
  35. #驼峰下划线转换
  36. table-underline: true
  37. #字段策略 :"忽略判断","非 NULL 判断"),"非空判断"
  38. field-strategy: ignored

5.配置连接池

读取Nacos配置中心配置文件自定义连接字符串,注入数据源,再配置@RefreshScope注解实现不同数据源切换

  1. package com.highzap.adminweb.configuration;
  2. import com.zaxxer.hikari.HikariDataSource;
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.cloud.context.config.annotation.RefreshScope;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import javax.sql.DataSource;
  9. /**
  10. * <p>描述: 类型描述 </p>
  11. * <p>创建时间: 2020/7/21 </p>
  12. *
  13. * @author <a href="mailto:wangl@highzap.com" rel="nofollow">王浪</a>
  14. * @version v1.0
  15. */
  16. @Configuration
  17. @RefreshScope
  18. @MapperScan(basePackages = "com.highzap.adminweb.mapper",sqlSessionFactoryRef ="sqlSessionFactory",sqlSessionTemplateRef = "sqlSessionTemplate")
  19. public class DataSourceConfig {
  20. // 对应Nacos配置中心配置的dbUrl
  21. @Value("${dbUrl}")
  22. private String dbUrl;
  23. // 对应Nacos配置中心配置的username
  24. @Value("${username}")
  25. private String username;
  26. // 对应Nacos配置中心配置的password
  27. @Value("${password}")
  28. private String password;
  29. // 对应Nacos配置中心配置的driverClassName
  30. @Value("${driverClassName}")
  31. private String driverClassName;
  32. @Bean(value = "dataSource")
  33. // RefreshScope动态刷新bean
  34. @RefreshScope
  35. public DataSource dataSource(){
  36. HikariDataSource dataSource = new HikariDataSource();
  37. dataSource.setUsername(username);
  38. dataSource.setPassword(password);
  39. dataSource.setJdbcUrl(dbUrl);
  40. dataSource.setDriverClassName(driverClassName);
  41. return dataSource;
  42. }
  43. }