Spring boot2 + mybatis + druid多数据源配置
文章目录
- 需引入的Jar包
- 项目目录结构
- application.yml配置
- 数据源配置
-
需引入的Jar包
dependencies{
implementation "org.springframework.boot:spring-boot-starter:2.1.18.RELEASE"
implementation "com.alibaba:druid-spring-boot-starter:1.1.20"
implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1"
}
项目目录结构
application.yml配置
# Spring settings
spring:
profiles:
active: dev
# datasource settings
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 数据源1
primary:
url: jdbc:mysql://${PRIMARY_MYSQL_HOST}:${PRIMARY_MYSQL_PORT}/${PRIMARY_MYSQL_DATAbase}?useSSL=false&characterEncoding=utf8&useUnicode=true&zeroDateTimeBehavior=convertToNull
username: ${PRIMARY_MYSQL_USERNAME}
password: ${PRIMARY_MYSQL_PASSWORD}
# 数据源2
secondary:
url: jdbc:mysql://${SECONDARY_MYSQL_HOST}:${SECONDARY_MYSQL_PORT}/${SECONDARY_MYSQL_DATAbase}?useSSL=false&characterEncoding=utf8&useUnicode=true&zeroDateTimeBehavior=convertToNull
username: ${SECONDARY_MYSQL_USERNAME}
password: ${SECONDARY_MYSQL_PASSWORD}
# 初始连接数
initial-size: 5
# 最大连接池数量
max-active: 20
# 最小连接池数量
min-idle: 5
# 获取连接最大等待时间
max-wait: 60000
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
max-open-prepared-statements: 20
# 用来检测连接是否有效的sql,要求是一个查询语句
validation-query: SELECt 1 FROM DUAL
#申请连接时执行validationQuery检测连接是否有效
test-on-borrow: false
# 归还连接时执行validationQuery检测连接是否有效
test-on-return: false
# 设置从连接池获取连接时是否检查连接有效
test-while-idle: true
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
filters: stat,wall
数据源配置
数据源1配置
import com.alibaba.druid.pool.DruidDataSource;
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.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;
@Configuration
@MapperScan(basePackages = {"数据源1的dao类存放目录"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
// mapper的xml文件存放路径
private static final String MAPPER_LOCAL = "classpath:mybatis/mapper/primary/*.xml";
@ConfigurationProperties("spring.datasource.druid.primary") // 对应applicatio.yml文件上的配置路径
@Primary
@Bean(name = "primaryDataSource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Bean(name = "primaryTransactionManager")
@Primary
public DataSourceTransactionManager primaryTransactionManager() {
return new DataSourceTransactionManager(druidDataSource());
}
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DruidDataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); // mybatis配置文件路径
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCAL));
return sessionFactoryBean.getObject();
}
}
数据源2配置
import com.alibaba.druid.pool.DruidDataSource;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Configuration
@MapperScan(basePackages = {"数据源2的dao类存放路径"}, sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
// mapper的xml文件存放路径
private static final String MAPPER_LOCAL = "classpath:mybatis/mapper/secondary/*.xml";
@Bean(name = "secondaryDataSource")
@ConfigurationProperties("spring.datasource.druid.secondary") // 对应applicatio.yml文件上的配置路径
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Bean(name = "secondaryTransactionManager")
public DataSourceTransactionManager secondaryTransactionManager() {
return new DataSourceTransactionManager(druidDataSource());
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DruidDataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); // mybatis配置文件路径
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCAL));
return sessionFactoryBean.getObject();
}
}