配置的两种方式:分包、AOP
https://blog.csdn.net/tuesdayma/article/details/81081666
一次踩坑
https://www.cnblogs.com/xiao-tao/p/10268016.html
事物支持
https://www.jianshu.com/p/42b589408b43
https://blog.csdn.net/qq_36138324/article/details/81611935
关于DataSource的连接池属性,可以SpringBoot批量注入属性注入进来,然后代码配置,也可以使用DataSourceProperties来进行配置(推荐使用DataSourceProperties,十分方便,同时还可以动态加载连接池类型)
一、创建连接池对象方式(代码写死连接池)
属性注入可以改为批量
@SpringBootConfiguration
public class PrimaryDataSourceConfig {
@Value("${jdbc.primary.driver-class-name}")
private String JDBC_DRIVER;
@Value("${jdbc.primary.url}")
private String JDBC_URL;
@Value("${jdbc.primary.username}")
private String JDBC_USERNAME;
@Value("${jdbc.primary.password}")
private String JDBC_PASSWORD;
@Value("${hikari.primary-pool-name}")
private String HIKARI_PRIMARY_POOL_NAME;
@Value("${hikari.maximum-pool-size}")
private Integer HIKARI_MAXIMUM_POOL_SIZE;
@Value("${hikari.minimum-idle}")
private Integer HIKARI_MINIMUM_IDLE;
@Value("${hikari.validation-timeout}")
private Long HIKARI_VALIDATION_TIMEOUT;
@Value("${hikari.max-lifetime}")
private Long HIKARI_MAX_LIFETIME;
@Value("${hikari.connection-timeout}")
private Long HIKARI_CONNECTION_TIMEOUT;
@Value("${hikari.data-source-properties.cachePrepStmts}")
private String HIKARI_DATASOURCE_PROPERTIES_CACHEPREPSTMTS;
@Value("${hikari.data-source-properties.prepStmtCacheSize}")
private String HIKARI_DATASOURCE_PROPERTIES_PREPSTMTCACHESIZE;
@Value("${hikari.data-source-properties.prepStmtCacheSqlLimit}")
private String HIKARI_DATASOURCE_PROPERTIES_PREPSTMTCACHESQLLIMIT;
@Value("${hikari.data-source-properties.useServerPrepStmts}")
private String HIKARI_DATASOURCE_PROPERTIES_USESERVERPREPSTMTS;
@Value("${hikari.data-source-properties.useLocalSessionState}")
private String HIKARI_DATASOURCE_PROPERTIES_USELOCALSESSIONSTATE;
@Value("${hikari.data-source-properties.useLocalTransactionState}")
private String HIKARI_DATASOURCE_PROPERTIES_USELOCALTRANSACTIONSTATE;
@Value("${hikari.data-source-properties.rewriteBatchedStatements}")
private String HIKARI_DATASOURCE_PROPERTIES_REWRITEBATCHEDSTATEMENTS;
@Value("${hikari.data-source-properties.cacheResultSetMetadata}")
private String HIKARI_DATASOURCE_PROPERTIES_CACHERESULTSETMETADATA;
@Value("${hikari.data-source-properties.cacheServerConfiguration}")
private String HIKARI_DATASOURCE_PROPERTIES_CACHESERVERCONFIGURATION;
@Value("${hikari.data-source-properties.elideSetAutoCommits}")
private String HIKARI_DATASOURCE_PROPERTIES_ELIDESETAUTOCOMMITS;
@Value("${hikari.data-source-properties.maintainTimeStats}")
private String HIKARI_DATASOURCE_PROPERTIES_MAINTAINTIMESTATS;
@Bean(name = "primaryDataSource")
@Primary
public DataSource createDateSource() {
try {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(JDBC_DRIVER);
dataSource.setJdbcUrl(JDBC_URL);
dataSource.setUsername(JDBC_USERNAME);
dataSource.setPassword(JDBC_PASSWORD);
dataSource.setPoolName(HIKARI_PRIMARY_POOL_NAME);
dataSource.setMaximumPoolSize(HIKARI_MAXIMUM_POOL_SIZE);
dataSource.setMinimumIdle(HIKARI_MINIMUM_IDLE);
dataSource.setValidationTimeout(HIKARI_VALIDATION_TIMEOUT);
dataSource.setMaxLifetime(HIKARI_MAX_LIFETIME);
dataSource.setConnectionTimeout(HIKARI_CONNECTION_TIMEOUT);
return dataSource;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
二、使用DataSourceProperties方式
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary.hikari")
public DataSource dataSource(@Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) {
return buildDataSource(dataSourceProperties);
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave.hikari")
public DataSource slaveDataSource(@Qualifier("slaveDataSourceProperties") DataSourceProperties slaveDataSourceProperties) {
return buildDataSource(slaveDataSourceProperties);
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSourceProperties slaveDataSourceProperties() {
return new DataSourceProperties();
}
private DataSource buildDataSource(DataSourceProperties dataSourceProperties) {
DataSourceBuilder factory = DataSourceBuilder.create(dataSourceProperties.getClassLoader())
.driverClassName(dataSourceProperties.getDriverClassName())
.url(dataSourceProperties.getUrl())
.username(dataSourceProperties.getUsername())
.password(dataSourceProperties.getPassword());
if (dataSourceProperties.getType() != null) {
factory.type(dataSourceProperties.getType());
}
return factory.build();
}
}
applicaiton.properties
#configuration primary for database
spring.datasource.primary.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.url=xxx
spring.datasource.primary.username=xxx
spring.datasource.primary.password=xxx
spring.datasource.primary.hikari.pool-name=PrimaryHikariPool
spring.datasource.primary.hikari.maximum-pool-size=2
spring.datasource.primary.hikari.minimum-idle=${spring.datasource.primary.hikari.maximum-pool-size}
spring.datasource.primary.hikari.validation-timeout=2500
spring.datasource.primary.hikari.max-lifetime=1800000
spring.datasource.primary.hikari.connection-timeout=30000
spring.datasource.primary.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.primary.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.primary.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.primary.hikari.data-source-properties.useLocalTransactionState=true
spring.datasource.primary.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.primary.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.primary.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.primary.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.primary.hikari.data-source-properties.maintainTimeStats=false
#configuration slave for database, read only
spring.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.slave.url=xxx
spring.datasource.slave.username=xxx
spring.datasource.slave.password=xxx
spring.datasource.slave.hikari.pool-name=SlaveHikariPool
spring.datasource.slave.hikari.maximum-pool-size=2
spring.datasource.slave.hikari.minimum-idle=${spring.datasource.slave.hikari.maximum-pool-size}
spring.datasource.slave.hikari.validation-timeout=2500
spring.datasource.slave.hikari.max-lifetime=1800000
spring.datasource.slave.hikari.connection-timeout=30000
spring.datasource.slave.hikari.read-only=true
spring.datasource.slave.hikari.data-source-properties.cachePrepStmts=${spring.datasource.primary.hikari.data-source-properties.cachePrepStmts}
spring.datasource.slave.hikari.data-source-properties.prepStmtCacheSize=${spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSize}
spring.datasource.slave.hikari.data-source-properties.prepStmtCacheSqlLimit=${spring.datasource.primary.hikari.data-source-properties.prepStmtCacheSqlLimit}
spring.datasource.slave.hikari.data-source-properties.useServerPrepStmts=${spring.datasource.primary.hikari.data-source-properties.useServerPrepStmts}
spring.datasource.slave.hikari.data-source-properties.useLocalSessionState=${spring.datasource.primary.hikari.data-source-properties.useLocalSessionState}
spring.datasource.slave.hikari.data-source-properties.useLocalTransactionState=${spring.datasource.primary.hikari.data-source-properties.useLocalTransactionState}
spring.datasource.slave.hikari.data-source-properties.rewriteBatchedStatements=${spring.datasource.primary.hikari.data-source-properties.rewriteBatchedStatements}
spring.datasource.slave.hikari.data-source-properties.cacheResultSetMetadata=${spring.datasource.primary.hikari.data-source-properties.cacheResultSetMetadata}
spring.datasource.slave.hikari.data-source-properties.cacheServerConfiguration=${spring.datasource.primary.hikari.data-source-properties.cacheServerConfiguration}
spring.datasource.slave.hikari.data-source-properties.elideSetAutoCommits=${spring.datasource.primary.hikari.data-source-properties.elideSetAutoCommits}
spring.datasource.slave.hikari.data-source-properties.maintainTimeStats=${spring.datasource.primary.hikari.data-source-properties.maintainTimeStats}
事物与Mybatis配置
@SpringBootConfiguration
@MapperScan(basePackages = "com.ainemo.crm.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimarySqlSessionFactoryConfig {
private final DataSource dataSource;
public PrimarySqlSessionFactoryConfig(@Qualifier("primaryDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactoryBean createSqlSessionFactory() {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/primary/mapper/*.xml";
//String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/primary/mapper/**/*.xml";
// 设置 mapper 对应的 XML 文件的路径
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
// 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource);
// 设置 mybatis 配置文件路径
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/primary/primary-config.xml"));
return sqlSessionFactoryBean;
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
@Bean(name = "primaryTransactionManager")
@Primary
public DataSourceTransactionManager primaryTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
@SpringBootConfiguration
@MapperScan(basePackages = "com.ainemo.crm.mapper.slave", sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveSqlSessionFactoryConfig {
private final DataSource dataSource;
public SlaveSqlSessionFactoryConfig(@Qualifier("slaveDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactory() {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/slave/mapper/*.xml";
// 设置 mapper 对应的 XML 文件的路径
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
// 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource);
// 设置 mybatis 配置文件路径
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/slave/slave-config.xml"));
return sqlSessionFactoryBean;
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
@Bean(name = "slaveTransactionManager")
public DataSourceTransactionManager slaveTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
primary-config的mybatis配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--使用jdbc的getGeneratedKeys 获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true"/>
<!--使用列别名替换列名 默认true -->
<setting name="useColumnLabel" value="true"/>
<!--开启驼峰命名转化 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--打开延迟加载开关,默认false-->
<!--<setting name="lazyLoadingEnabled" value="true"/>-->
<!--将积极加载改为消极加载,即按需加载,默认true-->
<!--<setting name="aggressiveLazyLoading" value="false"/>-->
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer"/>
<typeAlias alias="Long" type="java.lang.Long"/>
<typeAlias alias="String" type="java.lang.String"/>
<typeAlias alias="HashMap" type="java.util.HashMap"/>
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
<typeAlias alias="ArrayList" type="java.util.ArrayList"/>
<typeAlias alias="LinkedList" type="java.util.LinkedList"/>
<!--扫描data包,使用别名 -->
<package name="com.ainemo.xxx.data.dto"/>
</typeAliases>
</configuration>
事物支持:
启动类新增注解:@EnableTransactionManagement
@Transactional(value = "primaryTransactionManager")
@Override
public ResultVO test) {
/*
逻辑
*/
}
}
结构:
单独一个数据源配置参考:
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.io.IOException;
@Configuration
@MapperScan(basePackages = "com.ainemo.examination.dao.mapper")
public class SqlSessionFactoryConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource dataSource(@Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) {
return buildDataSource(dataSourceProperties);
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.config")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
private DataSource buildDataSource(DataSourceProperties dataSourceProperties) {
DataSourceBuilder factory = DataSourceBuilder.create(dataSourceProperties.getClassLoader())
.driverClassName(dataSourceProperties.getDriverClassName())
.url(dataSourceProperties.getUrl())
.username(dataSourceProperties.getUsername())
.password(dataSourceProperties.getPassword());
if (dataSourceProperties.getType() != null) {
factory.type(dataSourceProperties.getType());
}
return factory.build();
}
@Bean
@Primary
public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/mapper/*.xml";
//mapper.xml
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
//数据源
sqlSessionFactoryBean.setDataSource(dataSource);
//配置文件
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
return sqlSessionFactoryBean;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager primaryTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
#datasource config
spring.datasource.config.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.config.driverClassName=com.mysql.jdbc.Driver
spring.datasource.config.url=jdbc:mysql://1270.0.01:3306/test?socketTimeout=60000&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
spring.datasource.config.username=root
spring.datasource.config.password=123456
#datasource connection pool
spring.datasource.hikari.pool-name=ExaminationHikariPool
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.validation-timeout=2500
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=3072
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.hikari.data-source-properties.useLocalTransactionState=true
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.hikari.data-source-properties.maintainTimeStats=false
3个数据源参考:
# local
primary.datasource.type=com.zaxxer.hikari.HikariDataSource
primary.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
primary.datasource.url=jdbc:mysql://127.0.0.1:3306/test1?socketTimeout=60000&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
primary.datasource.username=root
primary.datasource.password=123456
# datafact
slave.datasource1.type=com.zaxxer.hikari.HikariDataSource
slave.datasource1.driverClassName=com.mysql.jdbc.Driver
slave.datasource1.url=jdbc:mysql://127.0.0.1:3306/test2?socketTimeout=60000&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
slave.datasource1.username=root
slave.datasource1.password=123456
# zengyu
slave.datasource2.type=com.zaxxer.hikari.HikariDataSource
slave.datasource2.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
slave.datasource2.url=jdbc:sqlserver://192.168.1.4:1433;DatabaseName=test
slave.datasource2.username=root
slave.datasource2.password=123
# database pool
spring.datasource.hikari.pool-name=HandleLocalPool
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.validation-timeout=2500
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=3072
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.hikari.data-source-properties.useLocalTransactionState=true
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.hikari.data-source-properties.maintainTimeStats=false
PrimaryDatasourceConfig
@SpringBootConfiguration
@MapperScan(basePackages = "com.test.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDatasourceConfig {
@Bean
@ConfigurationProperties(prefix = "primary.datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource primaryDataSource(@Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) {
DataSourceBuilder<?> builder = DataSourceBuilder.create(dataSourceProperties.getClassLoader())
.driverClassName(dataSourceProperties.getDriverClassName())
.url(dataSourceProperties.getUrl())
.username(dataSourceProperties.getUsername())
.password(dataSourceProperties.getPassword());
if (dataSourceProperties.getType() != null) {
builder.type(dataSourceProperties.getType());
}
return builder.build();
}
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/mapper/**/*.xml";
//mapper.xml
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
//数据源
sqlSessionFactoryBean.setDataSource(dataSource);
//配置文件
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
return sqlSessionFactoryBean;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
SlaveDataSource1Config
@SpringBootConfiguration
@MapperScan(basePackages = "com.test.mapper.slave1", sqlSessionFactoryRef = "slaveSqlSessionFactory1")
public class SlaveDataSource1Config {
@Bean
@ConfigurationProperties(prefix = "slave.datasource1")
public DataSourceProperties dataSourceProperties1() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource slaveDataSource1(@Qualifier("dataSourceProperties1") DataSourceProperties dataSourceProperties1) {
DataSourceBuilder<?> builder = DataSourceBuilder.create(dataSourceProperties1.getClassLoader())
.driverClassName(dataSourceProperties1.getDriverClassName())
.url(dataSourceProperties1.getUrl())
.username(dataSourceProperties1.getUsername())
.password(dataSourceProperties1.getPassword());
if (dataSourceProperties1.getType() != null) {
builder.type(dataSourceProperties1.getType());
}
return builder.build();
}
@Bean(name = "slaveSqlSessionFactory1")
public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("slaveDataSource1") DataSource dataSource) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/slave1/mapper/**/*.xml";
//mapper.xml
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
//数据源
sqlSessionFactoryBean.setDataSource(dataSource);
//配置文件
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
return sqlSessionFactoryBean;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
SlaveDataSource2Config
@SpringBootConfiguration
@MapperScan(basePackages = "com.test.mapper.slave2", sqlSessionFactoryRef = "slaveSqlSessionFactory2")
public class SlaveDataSource2Config {
@Bean
@ConfigurationProperties(prefix = "slave.datasource2")
public DataSourceProperties dataSourceProperties2() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource slaveDataSource2(@Qualifier("dataSourceProperties2") DataSourceProperties dataSourceProperties2) {
DataSourceBuilder<?> builder = DataSourceBuilder.create(dataSourceProperties2.getClassLoader())
.driverClassName(dataSourceProperties2.getDriverClassName())
.url(dataSourceProperties2.getUrl())
.username(dataSourceProperties2.getUsername())
.password(dataSourceProperties2.getPassword());
if (dataSourceProperties2.getType() != null) {
builder.type(dataSourceProperties2.getType());
}
return builder.build();
}
@Bean(name = "slaveSqlSessionFactory2")
public SqlSessionFactoryBean createSqlSessionFactory(@Qualifier("slaveDataSource2") DataSource dataSource) {
try {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
String packageXmlConfigPath = PathMatchingResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "mybatis/slave2/mapper/**/*.xml";
//mapper.xml
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(packageXmlConfigPath));
//数据源
sqlSessionFactoryBean.setDataSource(dataSource);
//配置文件
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
return sqlSessionFactoryBean;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}