Pg数据库配置多个数据源

此处所使用的是yml格式的配置文件,用的是mybatis,仅为自己使用的部分见解,有不对的地方还请大家指教,感谢🙏

一、进行配置文件的对应配置

  1. 主配置文件 - application.yml
spring:
  application:
    name: test
  profiles:
    active: dev
  main:
    # 循环依赖
    allow-circular-references: true
  datasource:
    primary:
      jdbc-url: ${spring.datasource.primary.jdbc-url}
      driver-class-name: ${spring.datasource.primary.driver-class-name}
      username: ${spring.datasource.primary.username}
      password: ${spring.datasource.primary.password}
    secondary:
      jdbc-url: ${spring.datasource.secondary.jdbc-url}
      driver-class-name: ${spring.datasource.secondary.driver-class-name}
      username: ${spring.datasource.secondary.username}
      password: ${spring.datasource.secondary.password}

其中primary为主数据库,如果是在已经开发的项目添加新的数据源配置,将原数据库放置在primary下比较合适,通过配置实现源代码无修改。secondary为你需要添加的数据库的配置信息。

  1. 从配置文件 - application-dev.yml
spring:
  datasource:
    primary:
      driver-class-name: org.postgresql.Driver
      username: postgres
      password: 密码
      jdbc-url: jdbc:postgresql://ip:端口/数据库名
    secondary:
      driver-class-name: org.postgresql.Driver
      username: postgres
      password: 密码
      jdbc-url: jdbc:postgresql://ip:端口/数据库名

根据自己的数据库的信息进行对应的配置,建议不要修改别的地方,因为此处是和主配置文件进行对应的,方便读取,文件名同理。(此处使用的jdbc-url,不是url,因为在使用url时候会出现问题,原因不明,希望有大佬解释下,抱拳)

二、配置类

  1. 主数据源配置 - PrimaryDataSourceConfig
package com.basic.config;


import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


/**
 * @Description  主数据源配置
 * /***********************************************
 *  * 主数据源配置(原有业务保持不变的配置)
 *  * 功能:确保原有Mapper接口、XML、事务不受影响
 *  * 参考:
 *  **********************************************
 *  */
@Configuration
@MapperScan(
        // 原有Mapper接口所在包
        basePackages = { "com.basic.auth.dao.mapper",
                       "com.basic.water.dao.mapper" },
        sqlSessionFactoryRef = "primarySqlSessionFactory" // 绑定专属SqlSessionFactory
)
public class PrimaryDataSourceConfig {

    /**
     * 创建主数据源Bean
     * @Primary 注解确保这是默认数据源
     * @ConfigurationProperties 读取spring.datasource.primary前缀配置
     */
    @Bean(name = "primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 主数据源的SqlSessionFactory
     * 指定原有XML文件路径:classpath:mapper/*.xml
     */
    @Bean(name = "primarySqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(
            @Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        // 关键设置:原有XML路径保持不变
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*.xml"));
        return sessionFactory.getObject();
    }

    /**
     * 主数据源事务管理器
     */
    @Bean(name = "primaryTransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

这里有几个地方需要注意:

  • mapper包扫描
    解释
  • xml文件
    解释
  • 注意
    解释

其余的没有特殊需要根据自身项目修改问题。

  1. 从数据源配置 - SecondaryDataSourceConfig
package com.basic.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @Description
 * /***********************************************
 * 新增数据源配置(完整独立配置)
 * 功能:实现新增数据源的完全隔离
 * 参考:新数据库指定事务@Transactional(transactionManager = "secondaryTransactionManager")
 *  **********************************************
 *  */

@Configuration
@MapperScan(
        basePackages = "com.basic.secondaryDataSource.mapper",  // 新增Mapper接口必须放在独立包
        sqlSessionFactoryRef = "secondarySqlSessionFactory"
)
public class SecondaryDataSourceConfig {

    /**
     * 次数据源Bean(不要加@Primary)
     */
    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 次数据源的SqlSessionFactory
     * 关键区别:XML路径设置为新的目录
     */
    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(
            @Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        // 新增XML路径:classpath:mapper/newdb/*.xml
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/secondaryDSMapper/*.xml"));

        return sessionFactory.getObject();
    }

    /**
     * 次数据源事务管理器
     */
    @Bean(name = "secondaryTransactionManager")
    public DataSourceTransactionManager transactionManager(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

需要注意的地方:

  • mapper扫描、建议从数据源mapper.java代码均放在一个包中
    解释
  • xml文件、与主数据源分开放置,建议单独创建文件夹放置
    解释
  • 此处有一个问题,从数据源的mapper文件不需要添加@Mapper注解,不然可能会不起作用,还有如果使用事务,在从数据源代码中,需要在事务后指定为从数据源,主数据源则不需要,@Transactional(transactionManager = “secondaryTransactionManager”)

以上仅为个人对于配置pg数据库多数据源了解,希望对你有所帮助!

免责声明
本人发布本文。您阅读或使用本内容时,视为已同意以下条款:

内容性质:本文所有信息(含第三方引用内容)仅作参考交流之用,不构成专业建议。
责任豁免:因使用本文内容导致的直接或间接损失(包括数据丢失、决策失误等),本人不承担任何法律责任。
用户义务:您需自行判断内容适用性,并承担使用后果。若转载、引用本文,须完整保留原文出处及作者信息,不得曲解原意。
不可抗力:如因黑客攻击、系统故障、政策调整等不可控因素导致内容错误或服务中断,本人免责。
争议管辖:本声明解释权归[本人]所有,争议适用[中国]法律。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值