因为业务需求,须要同时在SpringBoot中配置两套数据源(链接两个数据库),要求能作到service层在调用各数据库表的mapper时可以自动切换数据源,也就是mapper自动访问正确的数据库。mysql
本文内容:web
SpringBoot实战系列教程回顾:算法
SpringCache + Redis实现数据缓存spring
[Springboot]发送邮件、重置密码业务实战sql
SpringBoot版本:2.0.6.RELEASE数据库
项目结构图(原谅我保护隐私代码):
image.png后端
首先要在@SpringBootApplication排除该类,由于它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源缓存
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
你须要链接多少个数据库源,就配置几个,名字能够自由命名代替db1,db2安全
# database db.conn.str = useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&tinyInt1isBit=false spring.datasource.db1.jdbc-url=jdbc:mysql://xxxx1:xxxx/xxxxx1?${db.conn.str} spring.datasource.db1.username=xxxxx spring.datasource.db1.password=xxxxx spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver spring.datasource.db2.jdbc-url=jdbc:mysql://xxxxx2:xxxx/xxxxx2?${db.conn.str} spring.datasource.db2.username=xxxxx spring.datasource.db2.password=xxxxx spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
注意:这里请必定将spring.datasource.db1.url改成spring.datasource.db1.jdbc-urlspringboot
官方文档的解释是:由于链接池的实际类型没有被公开,因此在您的自定义数据源的元数据中没有生成密钥,并且在IDE中没有完成(由于DataSource接口没有暴露属性)。另外,若是您碰巧在类路径上有Hikari,那么这个基本设置就不起做用了,由于Hikari没有url属性(可是确实有一个jdbcUrl属性)。在这种状况下,您必须重写您的配置以下:
因为咱们禁掉了自动数据源配置,由于下一步就须要手动将这些数据源建立出来,建立DataSourceConfig类
@Configuration public class DataSourceConfig { @Bean(name = "db1") @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource businessDbDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "db2") @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource newhomeDbDataSource() { return DataSourceBuilder.create().build(); } }
这样作可让咱们的不一样包名底下的mapper自动使用不一样的数据源
建立Db1Config:
/** * @author yangzhendong01 */ @Configuration @MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db1"}, sqlSessionFactoryRef = "sqlSessionFactoryDb1") public class Db1Config { @Autowired @Qualifier("db1") private DataSource dataSourceDb1; @Bean public SqlSessionFactory sqlSessionFactoryDb1() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSourceDb1); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml")); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception { return new SqlSessionTemplate(sqlSessionFactoryDb1()); } }
建立Db2Config:
/** * @author yangzhendong01 */ @Configuration @MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db2"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2") public class Db2Config { @Autowired @Qualifier("db2") private DataSource dataSourceDb2; @Bean public SqlSessionFactory sqlSessionFactoryDb2() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSourceDb2); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml")); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception { return new SqlSessionTemplate(sqlSessionFactoryDb2()); } }
注意:此步必定要添加mapper.xml文件扫描路径,不然报错Invalid bound statement (not found)
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xxxxxx/*.xml"));
完成这些配置后,假设咱们有2个Mapper :
mapper.db1.xxxMapper和mapper.db2.xxxMapper
咱们在程序的任何位置使用前者时会自动链接db1库,后者链接db2库。
主要参考:
https://blog.csdn.net/neosmith/article/details/61202084
其余参考:
http://blog.didispace.com/springbootmultidatasource/
本文在一个Springboot+Mybatis项目的基础上,学习多数据源的快速配置。
祝你们国庆节假期快乐!
关注我
我目前是一名后端开发工程师。主要关注后端开发,数据安全,边缘计算等方向。
微信:yangzd1102(请注明来意)
Github:@qqxx6661
我的博客:
公众号201992.jpg
若是文章对你有帮助,不妨收藏起来并转发给您的 朋友们~