Spring Boot 2.x基礎教程:Spring Data JPA的多資料來源配置
阿新 • • 發佈:2020-06-23
[上一篇](http://blog.didispace.com/spring-boot-learning-21-3-7/)我們介紹了在使用JdbcTemplate來做資料訪問時候的多資料來源配置實現。接下來我們繼續學習如何在使用Spring Data JPA的時候,完成多資料來源的配置和使用。
## 新增多資料來源的配置
先在Spring Boot的配置檔案`application.properties`中設定兩個你要連結的資料庫配置,比如這樣:
```properties
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
# 日誌列印執行的SQL
spring.jpa.show-sql=true
# Hibernate的DDL策略
spring.jpa.hibernate.ddl-auto=create-drop
```
這裡除了JPA自身相關的配置之外,與JdbcTemplate配置時候的資料來源配置完全是一致的
**說明與注意**:
1. 多資料來源配置的時候,與單資料來源不同點在於`spring.datasource`之後多設定一個數據源名稱`primary`和`secondary`來區分不同的資料來源配置,這個字首將在後續初始化資料來源的時候用到。
2. 資料來源連線配置2.x和1.x的配置項是有區別的:2.x使用`spring.datasource.secondary.jdbc-url`,而1.x版本使用`spring.datasource.secondary.url`。如果你在配置的時候發生了這個報錯`java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.`,那麼就是這個配置項的問題。
## 初始化資料來源與JPA配置
完成多資料來源的配置資訊之後,就來建立個配置類來載入這些配置資訊,初始化資料來源,以及初始化每個資料來源要用的JdbcTemplate。
由於JPA的配置要比JdbcTemplate的負責很多,所以我們將配置拆分一下來處理:
1. 單獨建一個多資料來源的配置類,比如下面這樣:
```java
@Configuration
public class DataSourceConfiguration {
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
```
可以看到內容跟JdbcTemplate時候是一模一樣的。通過`@ConfigurationProperties`可以知道這兩個資料來源分別載入了`spring.datasource.primary.*`和`spring.datasource.secondary.*`的配置。`@Primary`註解指定了主資料來源,就是當我們不特別指定哪個資料來源的時候,就會使用這個Bean真正差異部分在下面的JPA配置上。
2. 分別建立兩個資料來源的JPA配置。
Primary資料來源的JPA配置:
```java
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryPrimary",
transactionManagerRef="transactionManagerPrimary",
basePackages= { "com.didispace.chapter38.p" }) //設定Repository所在位置
public class PrimaryConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
private Map