软件编程
位置:首页>> 软件编程>> java编程>> Spring boot 连接多数据源过程详解

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

作者:龙爱海  发布时间:2023-11-28 12:09:51 

标签:spring,boot,连接,多,数据源

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 就行了。

来源:https://blog.51cto.com/longithome/2400459

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com