本文共 7292 字,大约阅读时间需要 24 分钟。
1.application.yml中添加两个datasource
server: port: 8080spring: 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 去一个个获取数据库连接池在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