开发喵星球

若依实现 MySQL + PostgreSQL 多数据源配置(383)

本文将详细介绍如何在若依(RuoYi)框架中配置 MySQLPostgreSQL 多数据源,使项目能够灵活切换数据源,实现更丰富的数据交互场景。

一、添加 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 用户数据,无需手动切换回主库。

四、检查关键配置项

确保以下关键类和配置项已正确设置,以保证多数据源切换的稳定性和兼容性。

1. 确认 DatasourceType 中的数据源枚举定义

DatasourceType 类中添加与 application-druid.yml 配置一致的数据源类型,以便后续能识别多数据源。

public enum DatasourceType
{
    MASTER, // 主数据源 (MySQL)
    SLAVE   // 从数据源 (PostgreSQL)
}

2. 在 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);
}

3. 在 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);
}

4. 确保 @DataSource 注解在目标方法或类上

在需要使用多数据源的类或方法上添加 @DataSource 注解,并在 value 中指定数据源类型。

@Service
@DataSource(value = DataSourceType.SLAVE)
public class UserServiceImpl {
    // 优先级:方法上的注解优先于类上的注解
    @DataSource(value = DataSourceType.MASTER)
    public List<SysUser> selectUserList(SysUser user) {
        // 主库查询逻辑
    }    
}

完成上述配置后,重新启动项目,便可实现 MySQL 和 PostgreSQL 的多数据源切换。如未成功实现,检查每一步是否配置正确。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-11-06 14:15:34 阅读量:84
<<   >>


powered by kaifamiao