1. 程式人生 > >Spring Boot 2.x基礎教程:Spring Data JPA的多資料來源配置

Spring Boot 2.x基礎教程:Spring Data JPA的多資料來源配置

[上一篇](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