1.介绍
当系统不满足只是一个数据源的时候,还有一部门业务需要设计到其他的数据库的时候,去修改驱动,配置文件,重启系统会很麻烦,不易于部署实施,本文以Mysql和Oracle两种数据源不同切换介绍了基于@RefreshScope注解和Nacos配置的方式就可以达到不需要去修改代码,灵活切换不同数据源操作。
2.RefreshScope注解介绍
- 当有方法或者在类上添加@RefreshScope,Spring在初始化Bean的时候会使该Bean加载为惰性代理,使bean不一下加入到IOC容器当中,而是一个代理加入,在使用时(即,在调用方法时)才会进行初始化,并且作用域充当初始化值的缓存。要强制Bean在下一个方法调用上重新初始化,它有一个它有一个公共的方法
refreshAll()通过清除目标缓存刷新范围内的所有Bean。还有refresh(String)一种通过名称刷新单个bean 的方法。而Nacos本身会监听配置文件里面的内容,一旦配置文件被更改,那么就会刷新从配置文件里读取到的新内容,从而去刷新销毁上一个连接池,重新创建初始化连接池,达到动态切换数据源操作3.依赖管理
以Mysql和Oracle两种数据源为示例切换,如有需要可另外添加,实现方式都是一样<!-- Mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- Oracle驱动--><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.4.0-atlassian-hosted</version></dependency>
3.1完整项目依赖
```xml<artifactId>spring-cloud-highzap-dependencies</artifactId><groupId>com.highzap.cloud</groupId><version>1.0.0-SNAPSHOT</version><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
<a name="x4EPP"></a>## 4.配置文件配置文件分为本地配置文件和Nacos配置中心配置文件,本文介绍的是从本地配置文件去读取Nacos配置中心远端读取动态配置文件来加载,实现动态切换<a name="5AF3F"></a>### 4.1本地配置文件```yamlspring:application:name: zap-orgmanagement-servicecloud:nacos:config:server-addr: 127.0.0.1:8848file-extension: ymlprofiles:active: wangl-testmanagement:endpoints:web:exposure:include: refresh,healthenabled-by-default: true
4.2Nacos配置中心配置文件
本文使用的是读取Nacos配置文件中的连接字符串,配合@RefreshScope注解实现代码注入数据源,通过Nacos动态加载配置实现切换不同数据源
server:# 端口号port: 8082spring:application:# 应用名称name: zap-orgmanagement-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848#配置自定义连接字符串# Oracle连接字符串# dbUrl: jdbc:oracle:thin:@demo.highzap.com:1521:zapsoft# username: zapsoftuser# password: zapsoftuser!123# driverClassName: oracle.jdbc.driver.OracleDriver# Mysql连接字符串dbUrl: jdbc:mysql://127.0.0.1:3306/org?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=trueusername: rootpassword: rootdriverClassName: com.mysql.cj.jdbc.Driver# mybatis-plus配置mybatis-plus:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration:# 控制台打印SQL语句log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:#数据库ID自增"id-type: none#数据库大写下划线转换capital-mode: false#驼峰下划线转换table-underline: true#字段策略 :"忽略判断","非 NULL 判断"),"非空判断"field-strategy: ignored
5.配置连接池
读取Nacos配置中心配置文件自定义连接字符串,注入数据源,再配置@RefreshScope注解实现不同数据源切换
package com.highzap.adminweb.configuration;import com.zaxxer.hikari.HikariDataSource;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.context.config.annotation.RefreshScope;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/*** <p>描述: 类型描述 </p>* <p>创建时间: 2020/7/21 </p>** @author <a href="mailto:wangl@highzap.com" rel="nofollow">王浪</a>* @version v1.0*/@Configuration@RefreshScope@MapperScan(basePackages = "com.highzap.adminweb.mapper",sqlSessionFactoryRef ="sqlSessionFactory",sqlSessionTemplateRef = "sqlSessionTemplate")public class DataSourceConfig {// 对应Nacos配置中心配置的dbUrl@Value("${dbUrl}")private String dbUrl;// 对应Nacos配置中心配置的username@Value("${username}")private String username;// 对应Nacos配置中心配置的password@Value("${password}")private String password;// 对应Nacos配置中心配置的driverClassName@Value("${driverClassName}")private String driverClassName;@Bean(value = "dataSource")// RefreshScope动态刷新bean@RefreshScopepublic DataSource dataSource(){HikariDataSource dataSource = new HikariDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setJdbcUrl(dbUrl);dataSource.setDriverClassName(driverClassName);return dataSource;}}
