多数据源的实现方式大致分为注解和分包两种方式,因不希望在每个service都要加注解,故我的项目中选择的是基于分包的方式。
SpringBoot 版本为v2.1.3.RELEASE,Mybatis plus 版本为3.3.2。
- 配置文件application.yml
server:
port: 9003
spring:
application:
name: xxx
datasource:
druid:
test1:
url: jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 下面为连接池的补充设置,应用到上面所有数据源中
initialSize: 5 # 初始化大小,最小,最大
maxActive: 20
minIdle: 5
maxWait: 60000 # 配置获取连接等待超时的时间
timeBetweenEvictionRunsMillis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
minEvictableIdleTimeMillis: 30000 # 配置一个连接在池中最小生存的时间,单位是毫秒
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
test2:
url: jdbc:mysql://192.168.101.129:3306/db2?characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
initialSize: 5 #初始建立连接数量
minIdle: 5 #最小连接数量
maxActive: 20 #最大连接数量
maxWait: 10000 #获取连接最大等待时间,毫秒
testOnBorrow: true #申请连接时检测连接是否有效
testOnReturn: false #归还连接时检测连接是否有效
timeBetweenEvictionRunsMillis: 60000 #配置间隔检测连接是否有效的时间(单位是毫秒)
minEvictableIdleTimeMillis: 300000 #连接在连接池的最小生存时间(毫秒)
- 数据源配置
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.jst.framework.api.config.MybatisPlusConfig;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
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.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.jst.manage.mapper.test01", sqlSessionFactoryRef = "defaultSqlSessionFactory")
public class DataSourceConfig1 {
// 将这个对象放入Spring容器中
@Bean(name = "defaultDataSource")
// 表示这个数据源是默认数据源
@Primary
// 读取application.properties中的配置参数映射成为一个对象
// prefix表示参数的前缀
@ConfigurationProperties(prefix = "spring.datasource.druid.test1")
public DataSource getDefaultDateSource() {
// return DataSourceBuilder.create().build();
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "mybatis-plus.configuration")
public MybatisConfiguration globalConfiguration(){
return new MybatisConfiguration();
}
@Bean(name = "defaultSqlSessionFactory")
// 表示这个数据源是默认数据源
@Primary
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory defaultSqlSessionFactory(@Qualifier("defaultDataSource") DataSource datasource,MybatisConfiguration config)
throws Exception {
// SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setConfiguration(config);
// 设置mybatis的xml所在位置
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:**/mapper/test01/*.xml"));
return bean.getObject();
}
@Bean("defaultTransactionManager")
@Primary
public DataSourceTransactionManager defaultTransactionManager(@Qualifier("defaultDataSource") DataSource datasource){
return new DataSourceTransactionManager(datasource);
}
@Bean("defaultSqlSessionTemplate")
// 表示这个数据源是默认数据源
@Primary
public SqlSessionTemplate defaultsqlsessiontemplate(
@Qualifier("defaultSqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
有几个数据源写几个数据库配置
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
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.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.jst.manage.mapper.test02", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSourceConfig2 {
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.test2")
public DataSource getDateSource2() {
// return DataSourceBuilder.create().build();
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "test2SqlSessionFactory")
public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource datasource)
throws Exception {
// SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:**/mapper/test02/*.xml"));
return bean.getObject();
}
@Bean("test2TransactionManager")
public DataSourceTransactionManager defaultTransactionManager(@Qualifier("test2DataSource") DataSource datasource){
return new DataSourceTransactionManager(datasource);
}
@Bean("test2SqlSessionTemplate")
public SqlSessionTemplate test2sqlsessiontemplate(
@Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
这样在test01包下就会使用默认的数据源,在test02包下就会使用另外的数据源。
- 问题
- 与druid连接池整合失败:
添加druid的配置文件,在创建数据源的时候使用DruidDataSourceBuilder - 实现多数据源后mybatis-plus的配置文件失效:
失效原因是配置多数据源,自定义的sqlsessionFactory不会加载mybatis配置,而单数据源的sqlsessionFactory不是自定义的默认去加载了mybatis配置
解决:在创建SqlSessionFactory的时候使用MybatisSqlSessionFactoryBean,用代码的方式进行配置,设置到MybatisSqlSessionFactoryBean对象中。
- 与druid连接池整合失败:
若有不足和错误的地方,欢迎留言指明与交流!!