mybatis+多数据源+多连接池配置
网上大多配置都是mybatis+多数据源,并没有对应的多数据池,这里列举一个完整的例子,废话不多说,直接看代码
1.pom.xml
pom里只用增加一个mybatis整合spring-boot的依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
2.配置文件
配置文件里,一般情况下不同的环境数据库是分开的所有有两个配置文件,这里假设有两个数据源,分别为a,b
-
application-test.yml
spring: datasource: a: url: jdbc:mysql://localhost:3306/a username: a password: a b: url: jdbc:mysql://localhost:3307/b username: b password: b tomcat: initial-size: 1 min-idle: 1 max-idle: 1 max-active: 1
-
application-online.yml
spring: datasource: a: url: jdbc:mysql://localhost:3306/a username: a password: a b: url: jdbc:mysql://localhost:3307/b username: b password: b tomcat: initial-size: 1 min-idle: 3 max-idle: 20 max-active: 20 max-wait: 60000 test-while-idle: true test-on-borrow: false test-on-return: false validation-query: SELECT\u00201 time-between-eviction-runs-millis: 30000 min-evictable-idle-time-millis: 1800000 num-tests-per-eviction-run: 20 remove-abandoned: true remove-abandoned-timeout: 180 log-abandoned: true
上面两个配置,spring.datasource.a和spring.datasource.b是两个数据源的配置。
spring.datasource.tomcat是数据源连接池的配置。
当然,如果测试和线上都是用的一套数据库的话,可以直接在application.yml配置数据源,而在相应的application-{env}.yml里配置连接池
3.java类
-
为了注入每个数据源的配置,创建一个公共类:
public class CommonDataSourceConfiguration { private String url; private String username; private String password; 省略get/set }
-
第一个数据源配置:
@Configuration @ConfigurationProperties(prefix = "spring.datasource.a") @MapperScan(basePackages = { "com.sohu.tv.dao.a" }, sqlSessionTemplateRef = "aSqlSessionTemplate") public class ADataSourceConfiguration extends CommonDataSourceConfiguration { @Primary @Bean(name = "aDataSource") @ConfigurationProperties(prefix = "spring.datasource.tomcat") public DataSource aDataSource() { return DataSourceBuilder.create() .url(getUrl()) .username(getUsername()) .password(getPassword()).build(); } @Bean(name = "aSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("aDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } @Bean(name = "aSqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("aSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
-
这里,在ADataSourceConfiguration上标注ConfigurationProperties(prefix = “spring.datasource.a”),
这样可以把数据源的username等注入到CommonDataSourceConfiguration的属性中。
-
而aDataSource()上标注ConfigurationProperties(prefix = “spring.datasource.tomcat”),
可以把连接池的配置注入到DataSource中。
-
MapperScan(basePackages = { “com.sohu.tv.dao.a” },这里指定的会扫描com.sohu.tv.dao.a的包。
-
如果不同的数据源需要使用不同的连接池配置,可以按照如下配置即可:
-
配置文件
spring: datasource: a: url: jdbc:mysql://localhost:3306/a username: a password: a initial-size: 1 min-idle: 3
-
java类(当然,外部配置类上就不用再标注ConfigurationProperties了)
@Bean(name = "aDataSource") @ConfigurationProperties(prefix = "spring.datasource.a") public DataSource aDataSource() { return DataSourceBuilder.create() .url(getUrl()) .username(getUsername()) .password(getPassword()).build(); }
-
-
-
第二个数据源配置:
可以参照第一个类。
-
包结构类似如下:
com.sohu.tv.dao.a com.sohu.tv.dao.b
-
这样配置完以后,相应包下的dao将自动使用对应的数据源配置。