Spring boot 多数据源

pom.xml

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.1</version>
		</dependency>


		<!-- Druid 数据连接池依赖 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.9</version>
		</dependency>

	</dependencies>

application.properties

# master 数据源配置
master.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
master.datasource.username=***
master.datasource.password=***
master.datasource.driverClassName=com.mysql.jdbc.Driver

# second 数据源配置
second.datasource.url=jdbc:mysql:/localhost:3306/test1?useSSL=false
second.datasource.username=***
second.datasource.password=***
second.datasource.driverClassName=com.mysql.jdbc.Driver
MasterDataSourceConfig
package com.signal.config;

import com.alibaba.druid.pool.DruidDataSource;
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.beans.factory.annotation.Value;
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;

@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig extends DataSourceTransactionManager{

    // 精确到 master 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.signal.dao.master";
    static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";

    @Value("${master.datasource.url}")
    private String url;

    @Value("${master.datasource.username}")
    private String user;

    @Value("${master.datasource.password}")
    private String password;

    @Value("${master.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}
SecondDataSourceConfig
package com.signal.config;

import com.alibaba.druid.pool.DruidDataSource;
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.beans.factory.annotation.Value;
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;

@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {

    // 精确到 cluster 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.signal.dao.second";
    static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml";

    @Value("${second.datasource.url}")
    private String url;

    @Value("${second.datasource.username}")
    private String user;

    @Value("${second.datasource.password}")
    private String password;

    @Value("${second.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "secondDataSource")
    public DataSource clusterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(SecondDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

启动类

package com.signal;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@EnableConfigurationProperties
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

项目结构

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 支持多数据源配置,可以通过配置多个数据源来实现多数据源访问。下面是一个简单的示例,演示如何在 Spring Boot 应用程序中配置多个数据源。 首先,在 application.properties 文件中配置两个数据源: ``` # 配置数据源A spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=user1 spring.datasource.password=pass1 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 配置数据源B datasource.db2.url=jdbc:mysql://localhost:3306/db2 datasource.db2.username=user2 datasource.db2.password=pass2 datasource.db2.driver-class-name=com.mysql.jdbc.Driver ``` 然后,在应用程序中定义两个数据源的 bean: ``` @Configuration public class DataSourceConfig { @Bean(name = "dataSourceA") @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSourceA() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSourceB") @ConfigurationProperties(prefix = "datasource.db2") public DataSource dataSourceB() { return DataSourceBuilder.create().build(); } } ``` 在上面的配置中,我们定义了两个数据源,一个是 `dataSourceA`,另一个是 `dataSourceB`。其中,`dataSourceA` 使用了 `@Primary` 注解,表示它是默认数据源。`dataSourceB` 没有使用 `@Primary` 注解,因此需要在使用时指定。 最后,在需要使用数据源的地方,通过 `@Qualifier` 注解指定要使用的数据源: ``` @Service public class MyService { @Autowired @Qualifier("dataSourceA") private DataSource dataSourceA; @Autowired @Qualifier("dataSourceB") private DataSource dataSourceB; // 使用 dataSourceA 进行数据操作 public void doSomethingWithDataSourceA() { // ... } // 使用 dataSourceB 进行数据操作 public void doSomethingWithDataSourceB() { // ... } } ``` 在上面的代码中,我们通过 `@Qualifier` 注解指定了要使用的数据源。这样,在调用 `doSomethingWithDataSourceA` 方法时,使用的就是 `dataSourceA` 数据源;在调用 `doSomethingWithDataSourceB` 方法时,使用的就是 `dataSourceB` 数据源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值