若依框架多数据源切换方式
目录
- 前言
- 使用
- 1.首先yml里要配置正确的主从库数据源
- 2.在DataSourceType中http://www.devze.com配置从库
- 3.配置多数据源信息再DruidConfig里
- 总结
前言
在开发过程中时常遇到需要使用多个数据库的情况,读写分离也好还是不同数据库也好都需要配置多数据源在需要的时候能够切换到对应的数据源。
若依框架自带的多数据源配置切换即可实现。
使用方法如下:
使用
1.首先yml里要配置正确的主从库数据源
其中的enabled:true 代表的是是否开启从库,默认是关闭的需要改成true。
# 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: url: jdbc:mysql://****:3306/tablename?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: ***** password: ***** # 从库数据源 slave: # 从数据源开关/默认关闭js enabled: true url: jdbc:mysql://******:3306/tablename?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: ***** password: ****** # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 www.devze.com # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true
2.在DataSourceType中配置从库
若有多个从库就添加一个 eg: //从库2 SLAVE2
package com.ruoyi.common.enums; /** * 数据源 * * @author ruoyi */ public enum DataSourceType { /** * 主库 */ MASTER, /** * 从库 */ SLAVE }
3.配置多数据源信息再DruidConfig里
多一个数据源就要多一个配置
@Configuration public class DruidConfig { @Bean @ConfigurationProperties("spring.datasource.druid.master") public DataSource masterDataSource(DruidProperties druidProperties) { DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); return druidProperties.dataSource(dataSource); } @Bean @ConfigurationProperties("spring.datasource.druid.slave") @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") public DataSource slaveDataSource(DruidProperties druidProperties) { js DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); return druidProperties.dataSource(dataSource); } @Bean(name = "dynamicDataSource") @Primary public DynamicDataSource dataSource(DataSource masterDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); return new DynamicDataSource(masterDataSource, targetDataSources); } /** * 设置数据源 * * @param targetDataSources 备选数据源集合 * @param sourceName 数据源名称 * @param beanName bean名称 */ public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName) { try { DataSource dataSource = SpringUtils.getBean(beanName); targetDataSources.put(sourceName, dataSource); } catch (Exception e) { } }
以上信息配置完成后即可在需要切换数据源的时候在对应的mapper或service实现类上添加
@DataSource(value = DataSourceType.MASTER) 注解
eg:
@DataSource(value = DataSourceType.SLAVE)//切换数据源 @Override public AJAXResult selectNowUserList() { List<SysUser> sysUsers = userMapper.selectUserList(new SysUser()); return AjaxResult.success(sysUsers); }
以上就是若依框架自带的多数据源切换配置操作,其原理就是AbstractRoutingDataSource的源码里通过determinejsCurrentLookupKey 这个方法返回的key去resolvedDataSources里面找对应的DataSource,之后更新一期手动配置一套多数据切换。
总结
这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论