在开发过程中,会遇到多数据库的情况,那就需要使用该注解来实现:@DataSource(value = DataSourceType.SLAVE)
这样可以灵活的切换使用数据库。
在需要切换数据源的service或者mapper上添加此注解。
@DataSource(value = DataSourceType.SLAVE)
//@DataSource(value = DataSourceType.MASTER)
public List<...> select(...)
{
return mapper.select(...);
}
其中value
用来表示数据源名称,除MASTER
和SLAVE
其他均需要进行配置。
1.配置yml文件
需要添加从数据库
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url:
username:
password:
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: true
url:
username:
password:
2.添加数据源枚举
/**
* 数据源
*
*/
public enum DataSourceType
{
/**
* 主库
*/
MASTER,
/**
* 从库
*/
SLAVE
}
3.创建配置类读取数据库源
/**
* druid 配置多数据源
*
*/
@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)
{
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
{
//通过名字得到注册的Bean实例(就是上面添加的从数据库)
DataSource dataSource = SpringUtils.getBean(beanName);
targetDataSources.put(sourceName, dataSource);
}
catch (Exception e)
{
}
}
}
4.在需要使用多数据源方法或类上添加@DataSource注解,其中value用来表示数据源
@DataSource(value = DataSourceType.SLAVE)
public List<SysUser> selectUserList(SysUser user)
{
return userMapper.selectUserList(user);
}
参考来源:http://ruoyi.vip/
网友评论