# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。