1.application.YAML 中添加两个 datasource
- server:
- port: 8080
- spring:
- application:
- name: king
- datasource:
- master:
- type: com.zaxxer.hikari.HikariDataSource
- jdbc-url: jdbc:MySQL://localhost:3306/shengong?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=UTC
- driver-class-name: com.MySQL.cj.jdbc.Driver
- username: root
- password: arongking
- 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: arongking
- 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 去一个个获取数据库连接池在 YAML 中的配置的话, 数据库连接池的 (idle-timeout,minimum-idle, maximum-pool-size,pool-name,auto-commit,connection-test-query) 等, 一定要与 slave 节点平级, 不然 HikariConfig 是读取不到这些信息的.
* 如果手动赋值 HikariConfig 的话, 那就没有什么限制了, 写到哪里都行, 只需要用 Environment 去读取配置文件的值, 手动设置到 HikariConfig 就行了.
来源: http://www.bubuko.com/infodetail-3073210.html