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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。