首页 > 编程 > Java > 正文

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

2019-11-26 08:44:30
字体:
来源:转载
供稿:网友

1.application.yml中添加两个datasource

server: port: 8080spring: 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 就行了。

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表