SpringBoot多数据源配置

本文介绍如何在Spring Boot中配置多个数据源,包括通过创建连接池对象的方式和使用DataSourceProperties进行配置的方法。同时,还提供了详细的代码示例和属性配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置的两种方式:分包、AOP

https://blog.csdn.net/tuesdayma/article/details/81081666

一次踩坑

https://www.cnblogs.com/xiao-tao/p/10268016.html

事物支持

https://www.jianshu.com/p/42b589408b43

https://blog.csdn.net/qq_36138324/article/details/81611935

关于DataSource的连接池属性,可以SpringBoot批量注入属性注入进来,然后代码配置,也可以使用DataSourceProperties来进行配置(推荐使用DataSourceProperties,十分方便,同时还可以动态加载连接池类型)

一、创建连接池对象方式(代码写死连接池)

属性注入可以改为批量

@SpringBootConfiguration
public class PrimaryDataSourceConfig {

    @Value("${jdbc.primary.driver-class-name}")
    private String JDBC_DRIVER;
    @Value("${jdbc.primary.url}")
    private String JDBC_URL;
    @Value("${jdbc.primary.username}")
    private String JDBC_USERNAME;
    @Value("${jdbc.primary.password}")
    private String JDBC_PASSWORD;

    @Value("${hikari.primary-pool-name}")
    private String HIKARI_PRIMARY_POOL_NAME;
    @Value("${hikari.maximum-pool-size}")
    private Integer HIKARI_MAXIMUM_POOL_SIZE;
    @Value("${hikari.minimum-idle}")
    private Integer HIKARI_MINIMUM_IDLE;
    @Value("${hikari.validation-timeout}")
    private Long HIKARI_VALIDATION_TIMEOUT;
    @Value("${hikari.max-lifetime}")
    private Long HIKARI_MAX_LIFETIME;
    @Value("${hikari.connection-timeout}")
    private Long HIKARI_CONNECTION_TIMEOUT;

    @Value("${hikari.data-source-properties.cachePrepStmts}")
    private String HIKARI_DATASOURCE_PROPERTIES_CACHEPREPSTMTS;
    @Value("${hikari.data-source-properties.prepStmtCacheSize}")
    private String HIKARI_DATASOURCE_PROPERTIES_PREPSTMTCACHESIZE;
    @Value("${hikari.data-source-properties.prepStmtCacheSqlLimit}")
    private String HIKARI_DATASOURCE_PROPERTIES_PREPSTMTCACHESQLLIMIT;
    @Value("${hikari.data-source-properties.useServerPrepStmts}")
    private String HIKARI_DATASOURCE_PROPERTIES_USESERVERPREPSTMTS;
    @Value("${hikari.data-source-properties.useLocalSessionState}")
    private String HIKARI_DATASOURCE_PROPERTIES_USELOCALSESSIONSTATE;
    @Value("${hikari.data-source-properties.useLocalTransactionState}")
    private String HIKARI_DATASOURCE_PROPERTIES_USELOCALTRANSACTIONSTATE;
    @Value("${hikari.data-source-properties.rewriteBatchedStatements}")
    private String HIKARI_DATASOURCE_PROPERTIES_REWRITEBATCHEDSTATEMENTS;
    @Value("${hikari.data-source-properties.cacheResultSetMetadata}")
    private String HIKARI_DATASOURCE_PROPERTIES_CACHERESULTSETMETADATA;
    @Value("${hikari.data-source-properties.cacheServerConfiguration}")
    private String HIKARI_DATASOURCE_PROPERTIES_CACHESERVERCONFIGURATION;
    @Value("${hikari.data-source-properties.elideSetAutoCommits}")
    private String HIKARI_DATASOURCE_PROPERTIES_ELIDESETAUTOCOMMITS;
    @Value("${hikari.data-source-properties.maintainTimeStats}")
    private String HIKARI_DATASOURCE_PROPERTIES_MAINTAINTIMESTATS;

    @Bean(name = "primaryDataSource")
    @Primary
    public DataSource createDateSource() {
        try {
            HikariDataSource dataSource = new HikariDataSource();
            dataSource.setDriverClassName(JDBC_DRIVER);
            dataSource.setJdbcUrl(JDBC_URL);
            dataSource.setUsername(JDBC_USERNAME);
            dataSource.setPassword(JDBC_PASSWORD);

            dataSource.setPoolName(HIKARI_PRIMARY_POOL_NAME);
            dataSource.setMaximumPoolSize(HIKARI_MAXIMUM_POOL_SIZE);
            dataSource.setMinimumIdle(HIKARI_MINIMUM_IDLE);
            dataSource.setValidationTimeout(HIKARI_VALIDATION_TIMEOUT);
            dataSource.setMaxLifetime(HIKARI_MAX_LIFETIME);
            dataSource.setConnectionTimeout(HIKARI_CONNECTION_TIMEOUT);
            return dataSource;
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
}
二、使用DataSourceProperties方式
@Configuration
public class DataSourceConfig {

    @Bean(name = "primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary.hikari")
    public DataSource dataSource(@Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) {
        return buildDataSource(dataSourceProperties);
    }

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave.hikari")
    public DataSource slaveDataSource(@Qualifier("slaveDataSourceProperties") DataSourceProperties slaveDataSourceProperties) {
        return buildDataSource(slaveDataSourceProperties);
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSourceProperties slaveDataSourceProperties() {
        return new DataSourceProperties();
    }

    private DataSource buildDataSource(DataSourceProperties dataSourceProperties) {
        DataSourceBuilder factory = DataSourceBuilder.create(dataSourceProperties.getClassLoader())
                .driverClassName(dataSourceProperties.getDriverClassName())
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword());
        if (dataSourceProperties.getType() != null) {
            factory.type(dataSourceProperties.getType());
        }

        return factory.build();
    }
}

applicaiton.properties
#configuration primary for database
spring.datasource.primary.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.url=xxx
spring.datasource.primary.username=xxx
spring.datasource.primary.password=xxx
spring.datasource.primary.hikari.pool-name=PrimaryHikariPool
spring.datasource.primary.hikari.maximum-pool-size=2
spring.datasource.primary.hikari.minimum-idle=${spring.datasource.primary.hikari.maximum-pool-size}
spring.datasource.primary.hikari.validation-timeout=2500
spring.datasource.primary.hikari.max-lifetime=1800000
spring.datasource.primary.hikari.connection-timeout=30000
spring.datasource.primary.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.primary.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.primary.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.primary.hikari.data-source-properties.useLocalTransactionState=true
spring.datasource.primary.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.primary.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.primary.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.primary.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.primary.hikari.data-source-properties.maintainTimeStats=false

#configuration slave for database, read only
spring.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.slave.url=xxx
spring.datasource.slave.username=xxx
spring.datasource.slave.password=xxx
spring.datasource.slave.hikari.pool-name=SlaveHikariPool
spring.datasource.slave.hikari.maximum-pool-size=2
spring.datasource.slave.hikari.minimum-idle=${spring.datasource.slave.hikari.maximum-pool-size}
spring.datasource.slave.hikari.validation-timeout=2500
spring.datasource.slave.hikari.max-lifetime=1800000
spring.datasource.slave.hikari.connection-timeout=30000
spring.datasource.slave.hikari.read-only=true
spring.datasource.slave.hikari.data-source-properties.cachePrepStmts=${spring.datasource.primary.hikari.data-source-properties.cachePrepStmts}
spring.datasource.slave.hikari.data-source-properties.prepStmtCacheSize=${spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSize}
spring.datasource.slave.hikari.data-source-properties.prepStmtCacheSqlLimit=${spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSqlLimit}
spring.datasource.slave.hikari.data-source-properties.useServerPrepStmts=${spring.datasource.primary.hikari.data-source-properties.useServerPrepStmts}
spring.datasource.slave.hikari.data-source-properties.useLocalSessionState=${spring.datasource.primary.hikari.data-source-properties.useLocalSessionState}
spring.datasource.slave.hikari.data-source-properties.useLocalTransactionState=${spring.datasource.primary.hikari.data-source-properties.useLocalTransactionState}
spring.datasource.slave.hikari.data-source-properties.rewriteBatchedStatements=${spring.datasource.primary.hikari.data-source-properties.rewriteBatchedStatements}
spring.datasource.slave.hikari.data-source-properties.cacheResultSetMetadata=${spring.datasource.primary.hikari.data-source-properties.cacheResultSetMetadata}
spring.datasource.slave.hikari.data-source-properties.cacheServerConfiguration=${spring.datasource.primary.hikari.data-source-properties.cacheServerConfiguration}
spring.datasource.slave.hikari.data-source-properties.elideSetAutoCommits=${spring.datasource.primary.hikari.data-source-properties.elideSetAutoCommits}
spring.datasource.slave.hikari.data-source-properties.maintainTimeStats=${spring.datasource.primary.hikari.data-source-properties.maintainTimeStats}

事物与Mybatis配置
@SpringBootConfiguration
@MapperScan(basePackages = "com.ainemo.crm.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimarySqlSessionFactoryConfig {

    private final DataSource dataSource;

    public PrimarySqlSessionFactoryConfig(@Qualifier("primaryDataSource") DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean(name = "primarySqlSessionFactory")
    @Primary
    public SqlSessionFactoryBean createSqlSessionFactory() {
        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/primary/mapper/*.xml";
            //String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/primary/mapper/**/*.xml";

            // 设置 mapper 对应的 XML 文件的路径
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
            // 设置数据源
            sqlSessionFactoryBean.setDataSource(dataSource);
            // 设置 mybatis 配置文件路径
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/primary/primary-config.xml"));
            return sqlSessionFactoryBean;
        } catch (Exception ex) {
            throw new RuntimeException(ex.getMessage(), ex);
        }
    }

    @Bean(name = "primaryTransactionManager")
    @Primary
    public DataSourceTransactionManager primaryTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}

@SpringBootConfiguration
@MapperScan(basePackages = "com.ainemo.crm.mapper.slave", sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveSqlSessionFactoryConfig {

    private final DataSource dataSource;

    public SlaveSqlSessionFactoryConfig(@Qualifier("slaveDataSource") DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactoryBean createSqlSessionFactory() {
        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/slave/mapper/*.xml";
            // 设置 mapper 对应的 XML 文件的路径
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
            // 设置数据源
            sqlSessionFactoryBean.setDataSource(dataSource);
            // 设置 mybatis 配置文件路径
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/slave/slave-config.xml"));
            return sqlSessionFactoryBean;
        } catch (Exception ex) {
            throw new RuntimeException(ex.getMessage(), ex);
        }
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}

primary-config的mybatis配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <!--使用jdbc的getGeneratedKeys 获取数据库自增主键值 -->
        <setting name="useGeneratedKeys" value="true"/>
        <!--使用列别名替换列名 默认true -->
        <setting name="useColumnLabel" value="true"/>
        <!--开启驼峰命名转化 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!--打开延迟加载开关,默认false-->
        <!--<setting name="lazyLoadingEnabled" value="true"/>-->
        <!--将积极加载改为消极加载,即按需加载,默认true-->
        <!--<setting name="aggressiveLazyLoading" value="false"/>-->
    </settings>

    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer"/>
        <typeAlias alias="Long" type="java.lang.Long"/>
        <typeAlias alias="String" type="java.lang.String"/>
        <typeAlias alias="HashMap" type="java.util.HashMap"/>
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
        <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
        <typeAlias alias="LinkedList" type="java.util.LinkedList"/>

        <!--扫描data包,使用别名 -->
        <package name="com.ainemo.xxx.data.dto"/>
    </typeAliases>
</configuration>

事物支持:
启动类新增注解:@EnableTransactionManagement

 @Transactional(value = "primaryTransactionManager")
    @Override
    public ResultVO test) {
        /*
        逻辑
		*/
       }
    }

结构:
在这里插入图片描述

单独一个数据源配置参考:



import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.io.IOException;

@Configuration
@MapperScan(basePackages = "com.ainemo.examination.dao.mapper")
public class SqlSessionFactoryConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource dataSource(@Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) {
        return buildDataSource(dataSourceProperties);
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.config")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    private DataSource buildDataSource(DataSourceProperties dataSourceProperties) {
        DataSourceBuilder factory = DataSourceBuilder.create(dataSourceProperties.getClassLoader())
                .driverClassName(dataSourceProperties.getDriverClassName())
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword());
        if (dataSourceProperties.getType() != null) {
            factory.type(dataSourceProperties.getType());
        }
        return factory.build();
    }


    @Bean
    @Primary
    public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) {

        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/mapper/*.xml";
            //mapper.xml
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
            //数据源
            sqlSessionFactoryBean.setDataSource(dataSource);
            //配置文件
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
            return sqlSessionFactoryBean;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager primaryTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

#datasource config
spring.datasource.config.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.config.driverClassName=com.mysql.jdbc.Driver
spring.datasource.config.url=jdbc:mysql://1270.0.01:3306/test?socketTimeout=60000&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
spring.datasource.config.username=root
spring.datasource.config.password=123456

#datasource connection pool
spring.datasource.hikari.pool-name=ExaminationHikariPool
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.validation-timeout=2500
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=3072
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.hikari.data-source-properties.useLocalTransactionState=true
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.hikari.data-source-properties.maintainTimeStats=false

3个数据源参考:

# local
primary.datasource.type=com.zaxxer.hikari.HikariDataSource
primary.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
primary.datasource.url=jdbc:mysql://127.0.0.1:3306/test1?socketTimeout=60000&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
primary.datasource.username=root
primary.datasource.password=123456

# datafact
slave.datasource1.type=com.zaxxer.hikari.HikariDataSource
slave.datasource1.driverClassName=com.mysql.jdbc.Driver
slave.datasource1.url=jdbc:mysql://127.0.0.1:3306/test2?socketTimeout=60000&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
slave.datasource1.username=root
slave.datasource1.password=123456

# zengyu
slave.datasource2.type=com.zaxxer.hikari.HikariDataSource
slave.datasource2.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
slave.datasource2.url=jdbc:sqlserver://192.168.1.4:1433;DatabaseName=test
slave.datasource2.username=root
slave.datasource2.password=123


# database pool
spring.datasource.hikari.pool-name=HandleLocalPool
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.validation-timeout=2500
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=3072
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.hikari.data-source-properties.useLocalTransactionState=true
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.hikari.data-source-properties.maintainTimeStats=false
PrimaryDatasourceConfig
@SpringBootConfiguration
@MapperScan(basePackages = "com.test.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDatasourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "primary.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource primaryDataSource(@Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) {
        DataSourceBuilder<?> builder = DataSourceBuilder.create(dataSourceProperties.getClassLoader())
                .driverClassName(dataSourceProperties.getDriverClassName())
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword());
        if (dataSourceProperties.getType() != null) {
            builder.type(dataSourceProperties.getType());
        }
        return builder.build();
    }


    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) {

        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/mapper/**/*.xml";
            //mapper.xml
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
            //数据源
            sqlSessionFactoryBean.setDataSource(dataSource);
            //配置文件
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
            return sqlSessionFactoryBean;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

SlaveDataSource1Config
@SpringBootConfiguration
@MapperScan(basePackages = "com.test.mapper.slave1", sqlSessionFactoryRef = "slaveSqlSessionFactory1")
public class SlaveDataSource1Config {


    @Bean
    @ConfigurationProperties(prefix = "slave.datasource1")
    public DataSourceProperties dataSourceProperties1() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource slaveDataSource1(@Qualifier("dataSourceProperties1") DataSourceProperties dataSourceProperties1) {
        DataSourceBuilder<?> builder = DataSourceBuilder.create(dataSourceProperties1.getClassLoader())
                .driverClassName(dataSourceProperties1.getDriverClassName())
                .url(dataSourceProperties1.getUrl())
                .username(dataSourceProperties1.getUsername())
                .password(dataSourceProperties1.getPassword());
        if (dataSourceProperties1.getType() != null) {
            builder.type(dataSourceProperties1.getType());
        }
        return builder.build();
    }


    @Bean(name = "slaveSqlSessionFactory1")
    public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("slaveDataSource1") DataSource dataSource) {

        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/slave1/mapper/**/*.xml";
            //mapper.xml
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
            //数据源
            sqlSessionFactoryBean.setDataSource(dataSource);
            //配置文件
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
            return sqlSessionFactoryBean;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
SlaveDataSource2Config
@SpringBootConfiguration
@MapperScan(basePackages = "com.test.mapper.slave2", sqlSessionFactoryRef = "slaveSqlSessionFactory2")
public class SlaveDataSource2Config {


    @Bean
    @ConfigurationProperties(prefix = "slave.datasource2")
    public DataSourceProperties dataSourceProperties2() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource slaveDataSource2(@Qualifier("dataSourceProperties2") DataSourceProperties dataSourceProperties2) {
        DataSourceBuilder<?> builder = DataSourceBuilder.create(dataSourceProperties2.getClassLoader())
                .driverClassName(dataSourceProperties2.getDriverClassName())
                .url(dataSourceProperties2.getUrl())
                .username(dataSourceProperties2.getUsername())
                .password(dataSourceProperties2.getPassword());
        if (dataSourceProperties2.getType() != null) {
            builder.type(dataSourceProperties2.getType());
        }
        return builder.build();
    }


    @Bean(name = "slaveSqlSessionFactory2")
    public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("slaveDataSource2") DataSource dataSource) {

        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/slave2/mapper/**/*.xml";
            //mapper.xml
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
            //数据源
            sqlSessionFactoryBean.setDataSource(dataSource);
            //配置文件
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
            return sqlSessionFactoryBean;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值