多数据源
在实际开发中,经常可能遇到在一个应用中可能需要访问多个数据库的情况,在项目中使用注解来完成此项功能。
在需要被切换数据源的Service
或Mapper
方法上添加@DataSource
注解,使用方法如下:
@DataSource(value = DataSourceType.MASTER)
public List<...> select(...)
{
return mapper.select(...);
}
其中value
用来表示数据源名称,除MASTER
和SLAVE
其他均需要进行配置。
1.注解参数说明
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
value | DataSourceType | DataSourceType.MASTER | 主库 |
2.多数据源使用
1、在application-druid.yml
配置从库数据源
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: password
2、在DataSourceType
类添加数据源枚举
/**
* 从库
*/
SLAVE
3、在DruidConfig
配置读取数据源
@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);
}
4、在DruidConfig
类dataSource
方法添加数据源
setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
5、在需要使用多数据源方法或类上添加@DataSource
注解,其中value
用来表示数据源
@DataSource(value = DataSourceType.SLAVE)
public List<SysUser> selectUserList(SysUser user)
{
return userMapper.selectUserList(user);
}
@Service
@DataSource(value = DataSourceType.SLAVE)
public class SysUserServiceImpl
3.手动切换数据源
在需要切换数据源的方法中使用DynamicDataSourceContextHolder
类实现手动切换,使用方法如下:
public List<SysUser> selectUserList(SysUser user)
{
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
List<SysUser> userList = userMapper.selectUserList(user);
DynamicDataSourceContextHolder.clearDataSourceType();
return userList;
}
逻辑实现代码 com.ruoyi.framework.aspectj.DataSourceAspect
注意:目前配置了一个从库,默认关闭状态。如果不需要多数据源不用做任何配置。 另外可新增多个从库。支持不同数据源(Mysql、Oracle、SQLServer)
提示
如果有
Service
方法内多个注解无效的情况使用内部方法调用SpringUtils.getAopProxy(this).xxxxxx(xxxx)
;