Springboot之使用分包方式拆分数据源,即一系列问题

在开发项目中可能遇到业务,对于不同的请求分别访问不同的数据库,这时该怎么解决呢

先在配置文件中定义好两套不同的数据源,看好格式分为test1,test2两种,只要后面的这部分遵守规范就可以了.

Springboot之使用分包方式拆分数据源,即一系列问题_第1张图片

#springboot2.0改为这个了
#spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = 123

spring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = 123

然后把mapper按包进行分类,让test1包下的mapper访问test1数据库,test2下的访问test2数据库

Springboot之使用分包方式拆分数据源,即一系列问题_第2张图片

我这里创建了两个数据库用来测试

Springboot之使用分包方式拆分数据源,即一系列问题_第3张图片

我两个mapper里面都是相同的东西,都是往user表插入一条数据

Springboot之使用分包方式拆分数据源,即一系列问题_第4张图片

那怎么按包来进行访问不同的数库呢,这时候就需要创建两个配置类了,两个里面基本相同,只要把相应的地方改为test2就可以了.都是固定代码基本上不用变动.

Springboot之使用分包方式拆分数据源,即一系列问题_第5张图片

特别注意下面代码上有个@Primary注解,在springboot2.0以后不使用这个注解也不会报错,但是在2.0之前如果不加的话就会包一个找到多个数据源不知道该注入哪个的错,这时候就得在方法上加它,但是注意两个类只能一个类里面加,俩个类都加的话也会报错.

意思就是在DataSource1Config里面加上这个注解在DataSource2Config里就千万别加了

package com.buba.datasource;

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

import javax.sql.DataSource;
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.buba.test01", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {

    /**
     *
     * @methodDesc: 功能描述:(配置test1数据库)
     * @author: 余胜军
     * @param: @return
     * @createTime:2017年9月17日 下午3:16:44
     * @returnType:@return DataSource
     * @copyright:上海每特教育科技有限公司
     * @QQ:644064779
     */
    @Bean
     @Primary
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource test1DataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     *
     * @methodDesc: 功能描述:(test1 sql会话工厂)
     * @author: 余胜军
     * @param: @param
     *             dataSource
     * @param: @return
     * @param: @throws
     *             Exception
     * @createTime:2017年9月17日 下午3:17:08
     * @returnType:@param dataSource
     * @returnType:@return
     * @returnType:@throws Exception SqlSessionFactory
     * @copyright:上海每特教育科技有限公司
     * @QQ:644064779
     */
    @Bean(name = "test1SqlSessionFactory")
     
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
//		bean.setMapperLocations(
//				new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
        return bean.getObject();
    }

    /**
     *
     * @methodDesc: 功能描述:(test1 事物管理)
     * @author: 余胜军
     * @param: @param
     *             dataSource
     * @param: @return
     * @param: @throws
     *             Exception
     * @createTime:2017年9月17日 下午3:17:08
     * @returnType:@param dataSource
     * @returnType:@return
     * @returnType:@throws Exception SqlSessionFactory
     * @copyright:上海每特教育科技有限公司
     * @QQ:644064779
     */
    @Bean(name = "test1TransactionManager")
     
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test1SqlSessionTemplate")
    public SqlSessionTemplate test1SqlSessionTemplate(
            @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

然后写测试类分别访问不同的数据源,就会发现能分别访问了

Springboot之使用分包方式拆分数据源,即一系列问题_第6张图片

这个测试好后,那么如果使用事务的话怎么解决呢?多数据源肯定是多个事务,很简单只要加个注解就可以了.在事务注解上指定使用哪个事务管理器

@Transactional(transactionManager = "test1TransactionManager")

Springboot之使用分包方式拆分数据源,即一系列问题_第7张图片

Springboot之使用分包方式拆分数据源,即一系列问题_第8张图片

解决分布式事务https://blog.csdn.net/kxj19980524/article/details/86756251

你可能感兴趣的:(springboot)