Spring boot 连接多数据源过程详解

所属分类: 软件编程 / java 阅读数: 30
收藏 0 赞 0 分享

1.application.yml中添加两个datasource

server:
 port: 8080
spring:
 application:
  name: king
 datasource:
  master:
   type: com.zaxxer.hikari.HikariDataSource
   jdbc-url: jdbc:mysql://localhost:3306/king?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=UTC
   driver-class-name: com.mysql.cj.jdbc.Driver
   username: root
   password: 123456
   idle-timeout: 10000
   minimum-idle: 1
   maximum-pool-size: 10
   pool-name: master
   auto-commit: false
   connection-test-query: SELECT 1
  slave:
   type: com.zaxxer.hikari.HikariDataSource
   jdbc-url: jdbc:mysql://localhost:3306/king?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=UTC
   driver-class-name: com.mysql.cj.jdbc.Driver
   username: root
   password: 123456
   idle-timeout: 10000
   minimum-idle: 1
   maximum-pool-size: 10
   pool-name: slave
   auto-commit: false
   connection-test-query: SELECT 1

2.手动初始化数据源masterDataSource

package cn.bj.king.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
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.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 org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
/**
* @author ARongking
* @date 2019-03-28
*/
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"cn.bj.king.mapper.master"},
    sqlSessionFactoryRef = "masterSqlSessionFactory")
public class WriteDataSourceConfig {

  @Bean(name = "masterDataSource")
  @Primary
  @Qualifier("masterDataSource")
  public DataSource masterDataSource(@Qualifier("masterHikariConfig")HikariConfig hikariConfig) {
    System.out.println("实例化主库");
    HikariDataSource hikariDataSource=new HikariDataSource(hikariConfig);
    return hikariDataSource;
  }
  /**
  * 配置连接池信息
  * @return
  */
  @ConfigurationProperties(prefix = "spring.datasource.master")
  @Bean("masterHikariConfig")
  public HikariConfig masterHikariConfig(){
    HikariConfig hikariConfig=new HikariConfig();
    return hikariConfig;
  }
  /**
   * SqlSessionFactory配置
   *
   * @return
   * @throws Exception
   */
  @Bean(name = "masterSqlSessionFactory")
  @Primary
  public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    // 配置mapper文件位置
    sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/master/*.xml"));
    sqlSessionFactoryBean.setTypeAliasesPackage("cn.bj.king.entity");
    return sqlSessionFactoryBean.getObject();
  }

  /**
   * 配置事物管理器
   *
   * @return
   */
  @Bean(name = "masterTransactionManager")
  @Primary
  public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
  }
}

3.手动初始化数据源ReadDataSource

package cn.bj.king.config;
import com.github.pagehelper.PageInterceptor;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
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.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"cn.bj.king.mapper.slave"},
    sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class ReadDataSourceConfig {
  @Autowired
  Environment environment;

  @Bean(name = "slaveDataSource")
  @Qualifier("slaveDataSource")
  public DataSource slaveDataSource(@Qualifier("slaveHikariConfig")HikariConfig hikariConfig) {
    System.out.println("实例化从库");
    HikariDataSource hikariDataSource=new HikariDataSource(hikariConfig);
    return hikariDataSource;
  }

  /**
   * 配置连接池信息
   * @return
   */
  @ConfigurationProperties(prefix = "spring.datasource.slave")
  @Bean("slaveHikariConfig")
  public HikariConfig slaveHikariConfig(){
    HikariConfig hikariConfig=new HikariConfig();
    return hikariConfig;
  }

  /**
   * SqlSessionFactory配置
   *
   * @return
   * @throws Exception
   */
  @Bean(name = "slaveSqlSessionFactory")
  public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    // 配置mapper文件位置
    sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/slave/*.xml"));
    sqlSessionFactoryBean.setTypeAliasesPackage("cn.bj.king.entity");
    return sqlSessionFactoryBean.getObject();
  }
  /**
   * 配置事物管理器
   *
   * @return
   */
  @Bean(name = "slaveTransactionManager")
  public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
  }
}

4.测试启动是否正常初始化master和slave 两个数据源

5.这里需要注意几个地方:

  • 配置数据库连接池的时候,如果不是手动设置HikariConfig ,即通过Environment 去一个个获取数据库连接池在yml中的配置的话,数据库连接池的(idle-timeout,minimum-idle, maximum-pool-size,pool-name,auto-commit,connection-test-query)等,一定要与slave节点平级,不然 HikariConfig 是读取不到这些信息的。
  • 如果手动赋值HikariConfig 的话,那就没有什么限制了,写到哪里都行,只需要用Environment 去读取配置文件的值,手动设置到HikariConfig 就行了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java Set简介_动力节点Java学院整理

Set最大的特性就是不允许在其中存放的元素是重复的。接下来通过本文给大家分享java set常用方法和原理分析,需要的的朋友参考下吧
收藏 0 赞 0 分享

Java Timezone类常见问题_动力节点Java学院整理

这篇文章主要介绍了Java Timezone类常见问题的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

javaWeb项目部署到阿里云服务器步骤详解

本篇文章主要介绍了javaWeb项目部署到阿里云服务器步骤详解,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解使用zxing库生成QR-Code二维码

这篇文章主要介绍了详解使用zxing库生成QR-Code二维码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现对服务器的自动巡检邮件通知

这篇文章主要为大家详细介绍了java实现对服务器的自动巡检邮件通知,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java随机验证码生成实现实例代码

这篇文章主要介绍了java随机验证码生成实现实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

java读取txt文件代码片段

这篇文章主要为大家详细介绍了java读取txt文件的代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java连接mysql数据库的方法

这篇文章主要为大家详细介绍了java连接mysql数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java 算法之快速排序实现代码

这篇文章主要介绍了java 算法之快速排序实现代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

这篇文章主要介绍了详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多