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:SELECT1 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:SELECT1
2.手动初始化数据源masterDataSource
packagecn.bj.king.config;
importcom.zaxxer.hikari.HikariConfig;
importcom.zaxxer.hikari.HikariDataSource;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.mybatis.spring.SqlSessionFactoryBean;
importorg.mybatis.spring.annotation.MapperScan;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.boot.jdbc.DataSourceBuilder;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Primary;
importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;
importorg.springframework.jdbc.datasource.DataSourceTransactionManager;
importorg.springframework.transaction.annotation.EnableTransactionManagement;
importjavax.sql.DataSource;
/**
*@authorARongking
*@date2019-03-28
*/
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages={"cn.bj.king.mapper.master"},
sqlSessionFactoryRef="masterSqlSessionFactory")
publicclassWriteDataSourceConfig{
@Bean(name="masterDataSource")
@Primary
@Qualifier("masterDataSource")
publicDataSourcemasterDataSource(@Qualifier("masterHikariConfig")HikariConfighikariConfig){
System.out.println("实例化主库");
HikariDataSourcehikariDataSource=newHikariDataSource(hikariConfig);
returnhikariDataSource;
}
/**
*配置连接池信息
*@return
*/
@ConfigurationProperties(prefix="spring.datasource.master")
@Bean("masterHikariConfig")
publicHikariConfigmasterHikariConfig(){
HikariConfighikariConfig=newHikariConfig();
returnhikariConfig;
}
/**
*SqlSessionFactory配置
*
*@return
*@throwsException
*/
@Bean(name="masterSqlSessionFactory")
@Primary
publicSqlSessionFactorymasterSqlSessionFactory(@Qualifier("masterDataSource")DataSourcedataSource)throwsException{
SqlSessionFactoryBeansqlSessionFactoryBean=newSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolverresolver=newPathMatchingResourcePatternResolver();
//配置mapper文件位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/master/*.xml"));
sqlSessionFactoryBean.setTypeAliasesPackage("cn.bj.king.entity");
returnsqlSessionFactoryBean.getObject();
}
/**
*配置事物管理器
*
*@return
*/
@Bean(name="masterTransactionManager")
@Primary
publicDataSourceTransactionManagermasterTransactionManager(@Qualifier("masterDataSource")DataSourcedataSource){
DataSourceTransactionManagerdataSourceTransactionManager=newDataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
returndataSourceTransactionManager;
}
}
3.手动初始化数据源ReadDataSource
packagecn.bj.king.config;
importcom.github.pagehelper.PageInterceptor;
importcom.zaxxer.hikari.HikariConfig;
importcom.zaxxer.hikari.HikariDataSource;
importorg.apache.ibatis.plugin.Interceptor;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.mybatis.spring.SqlSessionFactoryBean;
importorg.mybatis.spring.annotation.MapperScan;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.boot.jdbc.DataSourceBuilder;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.core.env.Environment;
importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;
importorg.springframework.jdbc.datasource.DataSourceTransactionManager;
importorg.springframework.transaction.annotation.EnableTransactionManagement;
importjavax.sql.DataSource;
importjava.util.Properties;
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages={"cn.bj.king.mapper.slave"},
sqlSessionFactoryRef="slaveSqlSessionFactory")
publicclassReadDataSourceConfig{
@Autowired
Environmentenvironment;
@Bean(name="slaveDataSource")
@Qualifier("slaveDataSource")
publicDataSourceslaveDataSource(@Qualifier("slaveHikariConfig")HikariConfighikariConfig){
System.out.println("实例化从库");
HikariDataSourcehikariDataSource=newHikariDataSource(hikariConfig);
returnhikariDataSource;
}
/**
*配置连接池信息
*@return
*/
@ConfigurationProperties(prefix="spring.datasource.slave")
@Bean("slaveHikariConfig")
publicHikariConfigslaveHikariConfig(){
HikariConfighikariConfig=newHikariConfig();
returnhikariConfig;
}
/**
*SqlSessionFactory配置
*
*@return
*@throwsException
*/
@Bean(name="slaveSqlSessionFactory")
publicSqlSessionFactoryslaveSqlSessionFactory(@Qualifier("slaveDataSource")DataSourcedataSource)throwsException{
SqlSessionFactoryBeansqlSessionFactoryBean=newSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolverresolver=newPathMatchingResourcePatternResolver();
//配置mapper文件位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/slave/*.xml"));
sqlSessionFactoryBean.setTypeAliasesPackage("cn.bj.king.entity");
returnsqlSessionFactoryBean.getObject();
}
/**
*配置事物管理器
*
*@return
*/
@Bean(name="slaveTransactionManager")
publicDataSourceTransactionManagerslaveTransactionManager(@Qualifier("slaveDataSource")DataSourcedataSource){
DataSourceTransactionManagerdataSourceTransactionManager=newDataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
returndataSourceTransactionManager;
}
}
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就行了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。