开发企业级应用程序时常遇到要使用多个服务器上数据库的情况,此时需要配置多个数据源。查阅相关资料,遇到不少坑,亲测如下:
项目目录结构
关键文件
pom文件配置:
|
|
application.properties配置文件
|
|
ApplicationConfiguration配置类
|
|
同样的,ApplicationConfiguration2配置类
|
|
- type(HikariDataSource.class)指定数据源,设置数据库连接池,若无,则数据库默认时间(通常为8小时)无访问会导致连接断开。指定数据源后,配置文件只认jdbcUrl,即datasource.primary.jdbcUrl而不是datasource.primary.url。
- ApplicationConfiguration与ApplicationConfiguration2配置类,@MapperScan扫描的域要区分开(不同的包),两个dao文件ClubDataDao与GmDataDao分别操作不同的数据源。
- ApplicationConfiguration与ApplicationConfiguration2配置类,sqlSessionFactoryRef参数声明mybatis sqlsessionfactory来源。
- @Primary仅注解到单个数据源,作为默认数据源,用作操作频率最高的数据源上(也常用来区分主从数据库,这个与本文无关)。
其他文件
ClubDataDao
|
|
GmDataDao
|
|
ClubDataDaoMapper.xml
|
|
GmDataDaoMapper.xml
|
|
CrossOriginFilter
|
|
Swagger2
|
|
测试类TestController
|
|
使用swagger2测试如下:
总结
本例关键为配置类的@Primary(同一接口可能有多个实现类,声明默认情况下采取一种)注解,当前声明在数据源的bean上,告知Spring默认注入哪个。若不加,则报错:1Parameter 0 of method environmentMvcEndpoint in org.springframework.boot.actuate.autoconfigure.EndpointWebMvcManagementContextConfiguration required a single bean, but 2 were found
其他方案:若不加@Primary, 在启动类上声明排除数据源配置,效果相同12@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class})public class MainApplication {}