本文将详细介绍如何在若依(RuoYi)框架中配置
MySQL
和PostgreSQL
多数据源,使项目能够灵活切换数据源,实现更丰富的数据交互场景。
首先,为了连接 PostgreSQL
数据库,我们需要在 ruoyi-common
模块的 pom.xml
文件中添加 PostgreSQL
驱动包。
<!-- PostgreSQL 驱动包 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
接下来,在 ruoyi-admin
模块的 application-druid.yml
文件中配置多数据源。在这里,我们将 MySQL
设置为主库,PostgreSQL
设置为从库。
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 主库数据源配置 (MySQL)
master:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# 从库数据源配置 (PostgreSQL)
slave:
driverClassName: org.postgresql.Driver
enabled: true
url: jdbc:postgresql://localhost:5432/postgis_32_sample
username: postgres
password: 123456
以上配置将 MySQL 数据库指定为主数据源,而 PostgreSQL 为从库数据源。如果 PostgreSQL 从库配置项未生效,请继续以下步骤检查相关配置。
使用 @DataSource(value = DataSourceType.SLAVE)
注解来指定方法或类访问 PostgreSQL 从库。以下示例展示了如何在具体方法中指定从库:
@Service
public class VIPUserServiceImpl implements IVIPUserService
{
@Autowired
private VIPUserMapper vipUserMapper;
@DataSource(value = DataSourceType.SLAVE)
@Override
public VIPUser selectVIPUserList(VIPUser vip)
{
return vipUserMapper.selectVIPUserList(vip);
}
}
上述代码中,@DataSource(value = DataSourceType.SLAVE)
指定方法 selectVIPUserList
使用 PostgreSQL 数据源查询 VIP 用户数据,无需手动切换回主库。
确保以下关键类和配置项已正确设置,以保证多数据源切换的稳定性和兼容性。
DatasourceType
中的数据源枚举定义在 DatasourceType
类中添加与 application-druid.yml
配置一致的数据源类型,以便后续能识别多数据源。
public enum DatasourceType
{
MASTER, // 主数据源 (MySQL)
SLAVE // 从数据源 (PostgreSQL)
}
DruidConfig.java
中配置从库数据源读取逻辑位置:
ruoyi-framework
模块的config
包中的DruidConfig.java
在 DruidConfig
类中,通过 @ConditionalOnProperty
注解判断 PostgreSQL 数据源是否启用。以下代码展示了从库数据源配置方法:
@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);
}
DruidConfig
类中设置动态数据源在 DruidConfig
中的 dataSource
方法里,通过 DynamicDataSource
将主库和从库添加到 targetDataSources
配置中。
@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);
}
@DataSource
注解在目标方法或类上在需要使用多数据源的类或方法上添加 @DataSource
注解,并在 value
中指定数据源类型。
@Service
@DataSource(value = DataSourceType.SLAVE)
public class UserServiceImpl {
// 优先级:方法上的注解优先于类上的注解
@DataSource(value = DataSourceType.MASTER)
public List<SysUser> selectUserList(SysUser user) {
// 主库查询逻辑
}
}
完成上述配置后,重新启动项目,便可实现 MySQL 和 PostgreSQL 的多数据源切换。如未成功实现,检查每一步是否配置正确。
powered by kaifamiao