文章目录
此处所使用的是yml格式的配置文件,用的是mybatis,仅为自己使用的部分见解,有不对的地方还请大家指教,感谢🙏
一、进行配置文件的对应配置
- 主配置文件 - 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为你需要添加的数据库的配置信息。
- 从配置文件 - 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时候会出现问题,原因不明,希望有大佬解释下,抱拳)
二、配置类
- 主数据源配置 - 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文件

- 注意

其余的没有特殊需要根据自身项目修改问题。
- 从数据源配置 - 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数据库多数据源了解,希望对你有所帮助!
免责声明
本人发布本文。您阅读或使用本内容时,视为已同意以下条款:
内容性质:本文所有信息(含第三方引用内容)仅作参考交流之用,不构成专业建议。
责任豁免:因使用本文内容导致的直接或间接损失(包括数据丢失、决策失误等),本人不承担任何法律责任。
用户义务:您需自行判断内容适用性,并承担使用后果。若转载、引用本文,须完整保留原文出处及作者信息,不得曲解原意。
不可抗力:如因黑客攻击、系统故障、政策调整等不可控因素导致内容错误或服务中断,本人免责。
争议管辖:本声明解释权归[本人]所有,争议适用[中国]法律。
7334

被折叠的 条评论
为什么被折叠?



