springboot切换多数据源

在这里插入图片描述

1.多数据源垂直分割模式

在这里插入图片描述


创建 application.yml文件写入数据源配置

spring:
  datasource:
    test1: #数据源1
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/test1?useSSL=false&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true&allowPublicKeyRetrieval=true
        username: root
        password: 123456
    test2: #数据源2
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/test2?useSSL=false&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true&allowPublicKeyRetrieval=true
        username: root
        password: 123456

新建两个数据库
在这里插入图片描述


创建两个数据源配置(DataSourceOneConfig.class,DataSourceTwoConfig.class)


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.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;
import java.beans.ConstructorProperties;

//DateSource01
@Configuration
@MapperScan(basePackages = "com.huangan.mapper.test1",sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSourceOneConfig {

    /**
     * 扫描配置文件
     * @return
     */
    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource testDataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * sql会话工厂
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "test1SqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //指定mapper文件地址
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapping/test1/*.xml"));
        return bean.getObject();
    }

    /**
     * 事务管理
     * @param dataSource
     * @return
     */
    @Bean(name = "test1TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 模板
     * @param sqlSessionFactory
     * @return
     * @throws Exception
     */
    @Bean(name = "test1SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

创建两个dao文件写入sql

@Component
public interface UserMapper1 extends BaseMapper<TUser> {

    @Insert("INSERT INTO `t_user` (`name`, `age`) VALUES ( #{name}, #{age})")
    public  void insertUser1(@Param("name") String name,@Param("age") Integer age);

执行方法存入数据
在这里插入图片描述

2.数据源事务管理

@Primary指当前数据源的选择,在两个数据源执行时出现异常,a数据源执行成功,b数据源执行失败。

    @Override
    @Transactional(transactionManager = "test1TransactionManager")
    public void insertUser(String name, Integer age) {
        userMapper2.insertUser1(name,age);
        int a =0/1;
        userMapper1.insertUser1(name,age);
    }

@transactionManager 指定某个数据源事务开启,但是却不能同时回滚异常,数据保存jta+atomic数据源事务管理来接却数据源问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值