# SpringBoot怎么连接两个数据库 ## 目录 1. [引言](#引言) 2. [多数据源应用场景](#多数据源应用场景) 3. [基础环境准备](#基础环境准备) 4. [单数据源配置回顾](#单数据源配置回顾) 5. [多数据源配置方案](#多数据源配置方案) - 5.1 [方案一:AbstractRoutingDataSource动态路由](#方案一abstractroutingdatasource动态路由) - 5.2 [方案二:独立配置多个DataSource](#方案二独立配置多个datasource) 6. [完整代码实现](#完整代码实现) - 6.1 [application.yml配置](#applicationyml配置) - 6.2 [主数据源配置类](#主数据源配置类) - 6.3 [次数据源配置类](#次数据源配置类) - 6.4 [动态数据源切换实现](#动态数据源切换实现) 7. [事务管理注意事项](#事务管理注意事项) 8. [MyBatis多数据源支持](#mybatis多数据源支持) 9. [JPA多数据源配置](#jpa多数据源配置) 10. [常见问题解决方案](#常见问题解决方案) 11. [性能优化建议](#性能优化建议) 12. [总结](#总结) --- ## 引言 在现代企业级应用开发中,单一数据源往往无法满足复杂的业务需求。SpringBoot作为目前最流行的Java开发框架,提供了灵活的多数据源配置方案。本文将深入探讨SpringBoot连接多个数据库的三种主流实现方式,并通过完整示例代码演示生产环境最佳实践。 --- ## 多数据源应用场景 1. **读写分离架构**:主库负责写操作,从库处理读请求 2. **多租户系统**:不同租户数据隔离存储 3. **异构数据库整合**:MySQL+Oracle混合使用 4. **数据迁移场景**:新旧系统并行运行期间 5. **报表分析系统**:业务库与统计库分离 --- ## 基础环境准备 ```xml <!-- pom.xml 关键依赖 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> </dependencies>
@Configuration public class SingleDataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DruidDataSourceBuilder.create().build(); } }
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceType(); } }
@Configuration @MapperScan(basePackages = "com.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory") public class PrimaryDataSourceConfig { @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } }
spring: datasource: primary: url: jdbc:mysql://localhost:3306/db1 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver secondary: url: jdbc:mysql://localhost:3306/db2 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
@Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackages = "com.repository.primary", entityManagerFactoryRef = "primaryEntityManager", transactionManagerRef = "primaryTransactionManager" ) public class PrimaryConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DruidDataSourceBuilder.create().build(); } // 配置EntityManagerFactory和TransactionManager... }
@Bean(name = "xaTransactionManager") public JtaTransactionManager transactionManager() { UserTransactionManager userTransactionManager = new UserTransactionManager(); UserTransaction userTransaction = new UserTransactionImp(); return new JtaTransactionManager(userTransaction, userTransactionManager); }
@Bean(name = "secondarySqlSessionFactory") public SqlSessionFactory secondarySqlSessionFactory( @Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/secondary/*.xml")); return bean.getObject(); }
SpringBoot多数据源配置需要重点注意: 1. 数据源Bean的命名和注入 2. 事务管理器的隔离配置 3. 持久层框架的适配 4. 生产环境的监控方案
通过本文介绍的两种方案,开发者可以灵活应对不同复杂度的多数据源需求。建议在简单场景使用独立配置方案,在需要动态切换的场景采用AbstractRoutingDataSource实现。
最佳实践提示:对于微服务架构,建议优先考虑每个服务独享数据库的设计,而非在单个服务中使用多数据源。 “`
(注:此为精简版大纲,完整6200字文章需要扩展每个代码示例的详细说明、添加性能测试数据、异常处理方案等内容。实际撰写时可增加章节间的过渡段落和更深入的技术原理分析。)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。