Springboot 双数据源设置

yml配置

spring:
  datasource:
    wdf:  # 数据源1(standard 数据库,注意是jdbc-url)
      jdbc-url: jdbc:mysql://路径:3306/wdf?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
      driver-class-name: com.mysql.cj.jdbc.Driver  # 如果驱动类报红,将pom.xml中的mysql依赖的scope节点删除即可。
      username: root
      password: 123456
      initial-size: 10
      max-active: 100
      min-idle: 10
      max-wait: 60000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      #Oracle需要打开注释
      #validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
      filter:
        stat:
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: false
        wall:
          config:
            multi-statement-allow: true
    jeesite:  # 数据源2(startplan 数据库,注意是jdbc-url)
      jdbc-url: jdbc:mysql://路径:3306/jeesite?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
      driver-class-name: com.mysql.cj.jdbc.Driver  # 如果驱动类报红,将pom.xml中的mysql依赖的scope节点删除即可。
      username: root
      password: 123456
      initial-size: 10
      max-active: 100
      min-idle: 10
      max-wait: 60000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      #Oracle需要打开注释
      #validation-query: SELECT 1 FROM DUAL
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
      filter:
        stat:
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: false
        wall:
          config:
            multi-statement-allow: true

2:DatabaseConfig 编写

主数据源
package com.io.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
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;

/**
 * 数据源1相关配置(作为主数据库,项目启动默认连接此数据库)
 *
 * 主数据库都有 @Primary注解,从数据库都没有
 *
 * 需要额外注意的位置
 * 1:扫描Dao层包路径,basePackages = "com.io.dao"
 * 2:关联yml中的数据源,@ConfigurationProperties(prefix = "spring.datasource.wdf")
 * 3:扫描相关xml文件的所在路径,"classpath:mapper/*.xml"
 */
@Configuration
@Primary
@MapperScan(basePackages = "com.io.dao", sqlSessionTemplateRef = "sqlSessionTemplateWdf")
public class DatabaseConfig1 {

    @Bean(name = "dataSourceWdf")
    @ConfigurationProperties(prefix = "spring.datasource.wdf")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactoryWdf")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceWdf") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage("com.io.entity");
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return bean.getObject();
    }

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

    @Bean(name = "sqlSessionTemplateWdf")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryWdf") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

次数据源
package com.io.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 *
 * 需要额外注意的位置
 * 1:扫描Dao层包路径,basePackages = "com.io.js.user.dao"
 * 2:关联yml中的数据源,@ConfigurationProperties(prefix = "spring.datasource.jeesite")
 * 3:扫描相关xml文件的所在路径,"classpath:mapper/*.xml"
 */
@Configuration
@MapperScan(basePackages = "com.io.js.user.dao", sqlSessionTemplateRef = "sqlSessionTemplateJeesite")
public class DatabaseConfig2 {

    @Bean(name = "dataSourceJeesite")
    @ConfigurationProperties(prefix = "spring.datasource.jeesite")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactoryJeesite")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceJeesite") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage("com.io.js.user.entity");
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml"));
        return bean.getObject();
    }

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

    @Bean(name = "sqlSessionTemplateJeesite")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryJeesite") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3:使用

在这里插入图片描述

输出

在这里插入图片描述

4:编写过程中的易错问题

1: DatabaseConfig @Primary 注解只能给主数据源使用,不可以给副数据源
2:DatabaseConfig 内的@Bean名称请注意,那些名称在自己的文件中有自我调用,别把名称写错。
3:MybatisSqlSessionFactoryBean对象有可能无jar包 百度搜索一下导入进去,不可以改为 SqlSessionFactoryBean对象,会报错:Invalid bound statement
4:“classpath:mapper/*.xml ” 的设置请仔细填写路径
5:yml中的 mybatis / mybatis-plus 配置要关闭 mapper-locations ,typeAliasesPackage。这两项配置在 DatabaseConfig 中有配置

在这里插入图片描述

6:有使用到@Transactional注解的方法要 加一个属性 transactionManager = “transactionManagerWdf” 这个属性是表明回退的数据源是那个

例: @Transactional(rollbackFor = Exception.class, transactionManager = “transactionManagerWdf”)

7:如果方法中的数据源有两个 又使用了@Transactional,请将有使用次数据源 的代码重新写一个方法(这个方法就加一个@Transactional,数据源表明为次数据),再在此方法中调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值