springboot整合多数据源

1,有两个数据库都用个user表

2.配置文件有两个数据源

###datasource1
spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = root
###datasource2
spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = root

 

后面是固定的,前面可以自己定义的后面改的话会报错

通过不同的包来使用不同的数据源

创建两个数据源配置

package com.yanye.yanye.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.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.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

//DataSource01
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.yanye.yanye.test1", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {

    /**
     *
     * @methodDesc: 功能描述:(配置test1数据库)
     *
     */
    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     *
     * @methodDesc: 功能描述:(test1 sql会话工厂)
     *
     */
    @Bean(name = "test1SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@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 事物管理)
     *
     */
    @Bean(name = "test1TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

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

}

和test2 

 

调用不同的方法插入到不同的数据库中

package com.yanye.yanye.controller;

import com.yanye.yanye.test1.service.UserService1;
import com.yanye.yanye.test1.service.impl.UserService1Impl;
import com.yanye.yanye.test2.service.impl.UserService2Impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MybatiesMultiDataSourceController {

    @Autowired
    private UserService2Impl userService2;
    @Autowired
    private UserService1 userService1;

    @RequestMapping("/save1")
    public int  save1(@RequestParam("name") String name,@RequestParam("age") Integer age){
      return   userService1.save(name, age);
    }

    @RequestMapping("/save2")
    public int  save2(@RequestParam("name") String name,@RequestParam("age") Integer age){
        return   userService2.save(name, age);
    }
}

当时做的时候两个service接口都有一个save方法,但是我扫包范围是到test的地方,导致执行方法报错

后来发现mapper的方法越是save导致报错service1报错,service2不报错

或者吧scan的扫包范围指定到mapper就不会报错了

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

不同的数据源在一个其中一个事务,。这个事务是没办法管理其他数据源的,故,在方法里报异常,userservice2是不会回滚的,userservice1会回滚的

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值