使用Spring Boot配置多個資料來源 - Udith
Spring Boot是一個非常強大的框架,可以非常輕鬆地用於開發基於Spring的應用程式。這個框架最好的事情是什麼?您只需使用Java註釋即可輕鬆完成高階配置。因此,您可以將重點放在業務邏輯而不是應用程式配置上。雖然Spring Boot應用程式預設使用單個資料來源,但也可以使它們與多個資料來源一起使用。
單個資料來源
大多數情況下,我們開發的應用程式需要單個資料來源才能執行。在開發單個資料來源Spring Boot應用程式時,配置非常簡單。這只是在application.properties檔案中定義一些屬性的問題。以下是這樣的配置,其中顯示瞭如何定義基於MySQL的資料來源。
# DB connection properties spring.datasource.url=jdbc:mysql://host:3306/MY_DB spring.datasource.username = dbUser spring.datasource.password = password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA properties spring.jpa.hibernate.ddl-auto = validate spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect |
一旦正確定義了上述屬性,您剩下要做的就是在JPA級別上。那就是編寫Model類來表示表並編寫Repositories來訪問這些表。Spring在引擎蓋下照顧其餘的!
現在假設您有2個現有的後端應用程式在2個獨立的資料來源上工作。並且需要開發單個SB應用程式來管理這兩個資料來源上的資料。
那麼如何使用單個Spring Boot應用程式配置多個資料來源?這有可能嗎?
多個資料來源
這絕對是可能的,而不是那麼複雜。它只需要用Spring的註釋編寫一些配置類。然後在application.properties檔案中定義資料來源連線屬性,並正確地將儲存庫和模型組織到包中。所以讓我們先看看後面的第一個。
管理模型和儲存庫包:
包組織是配置多個資料來源的主要先決條件之一。確切地說,與2個資料來源相關的模型類和儲存庫類應該在單獨的包中。
例如,假設我們有2個資料來源作為A和B.與資料來源A相關的儲存庫類可以在一個或多個包中,我們將其假設為包com.udith.p和com.udith.q。條件是資料來源B的儲存庫不能位於com.udith.p或com.udith.q包中。但是如果需要,它們可以位於com.udith.ps之類的子包中。
同樣的條件也適用於Model類。但請注意,這不適用於Controller和Service類。
因此,對於此示例,我們假設儲存庫和模型的包如下所示:
模型: 資料來源A: com.udith.model.p com.udith.model.q 資料來源B: com.udith.model.r com.udith.model.s 倉儲: 資料來源A: com.udith.repo.p com.udith.repo.q 資料來源B: com.udith.repo.r com.udith.repo.s |
定義連線屬性
當我們使用單個資料來源時,我們使用“ spring.datasource。”字首定義連線屬性名稱。例如,連線URL定義如下。
spring.datasource.url=jdbc:mysql://localhost:3306/MY_DB
但是,當使用多個資料來源時,要求是每個資料來源的連線屬性名稱應具有不同的字首。所以讓我們定義我們的2個資料來源屬性如下。
# Connection properties of Data Source A spring.datasource.a.url=jdbc:mysql://host1:3306/MY_DB_A spring.datasource.a.username = dbUserA spring.datasource.a.password = passwordForA spring.datasource.a.driver-class-name=com.mysql.cj.jdbc.Driver # Connection properties of Data Source B spring.datasource.b.url=jdbc:mysql://host2:3306/MY_DB_B spring.datasource.b.username = dbUserB spring.datasource.b.password = passwordForB spring.datasource.b.driver-class-name=com.mysql.cj.jdbc.Driver |
請注意,這些字首可以是您喜歡的任何有效屬性名稱,並且不必以spring.datasource開頭。
編寫配置類
所以讓我們進入Configuration類。您所要做的就是為每個資料來源編寫如下2個配置類。每個類都將為資料來源,實體管理器工廠和事務管理器定義Spring bean。
所以這是我們的資料來源A的配置類:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = {"com.udith.repo.p", "com.udith.repo.q"}) public class ConfigA { @Primary @Bean(name = "dataSourceA") @ConfigurationProperties(prefix = "spring.datasource.a") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "entityManagerFactoryA") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dataSourceA") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.udith.model.p", "com.udith.model.q") .persistenceUnit("datasourceA") .build(); } @Primary @Bean(name = "transactionManagerA") public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactoryA") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } |
這是資料來源B的那個:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = {"com.udith.repo.r", "com.udith.repo.s"}) public class ConfigB { @Bean(name = "dataSourceB") @ConfigurationProperties(prefix = "spring.datasource.b") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "entityManagerFactoryB") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dataSourceB") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.udith.model.r", "com.udith.model.s") .persistenceUnit("datasourceB") .build(); } @Primary @Bean(name = "transactionManagerB") public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactoryB") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } |
現在讓我們簡要討論一下上面配置類中使用的一些重要註釋。
- 在每個配置類的頂部,@EnableJpaRepositories註釋隨屬性一起新增basePackages。在此屬性中,我們定義了包含與此特定資料來源相關的JPA儲存庫類的Java包。
- 然後我們定義方法,為該資料來源建立例項。此方法還具有屬性的註釋,該註釋告訴Spring 在建立此資料來源例項時應使用字首為給定值的屬性(來自application.properties檔案)。dataSource()javax.sql.DataSource@ConfigurationPropertiesprefix
- 下一個方法entityManagerFactory負責為資料來源建立bean。這裡我們將先前建立的資料來源例項作為方法引數傳遞,並使用構建器例項生成實體管理器工廠,提供包含與此資料來源相關的模型類的Java包的名稱。org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
- 最後,transactionManager方法建立要用於此資料來源的例項。org.springframework.transaction.PlatformTransactionManager
- 此外,您可能已經注意到,@Primary只有第一個配置類的bean定義中才有註釋。這個註釋告訴Spring使用第一個配置類中定義的資料來源,實體管理器工廠和事務管理器作為主bean。
自定義JPA屬性
如果您已完成到目前為止的步驟,則已完成使用多個資料來源的基本要求。但在某些情況下,可能需要自定義一些JPA屬性,例如,使用的命名策略。
當使用單個資料來源時,也可以透過在application.properties檔案中定義屬性來完成這些操作。例如,您可以按如下方式設定命名策略。
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy |
但是,當使用基於配置檔案的資料來源時(正如我們在前面的步驟中所做的那樣),由於某種原因,不會應用application.properties檔案中定義的這些屬性。因此,我們必須透過程式碼將它們傳遞給實體管理器工廠構建器,如下所示。
@Primary @Bean(name = "entityManagerFactoryA") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dataSourceA") DataSource dataSource) { Map jpaProperties = new HashMap<>(); jpaProperties.put("hibernate.naming_strategy", ImprovedNamingStrategy.class.getName()); // any other customized JPA properties return builder .dataSource(dataSource) .packages("com.udith.model.p", "com.udith.model.q") .persistenceUnit("datasourceA") .properties(jpaProperties) .build(); } |
完成此步驟後,您已使用Spring Boot應用程式成功配置了多個資料來源。
相關文章
- Spring Boot 配置多資料來源Spring Boot
- Spring Boot 多資料來源配置Spring Boot
- Spring boot 如何快速的配置多個 Redis 資料來源Spring BootRedis
- 使用Spring Boot配置JNDI資料來源 -Roy教程Spring Boot
- Spring多資料來源配置Spring
- Spring配置多資料來源Spring
- 基於Spring Boot與Spring Data JPA的多資料來源配置Spring Boot
- spring 配置多個資料來源的檔案Spring
- Spring Boot 中使用 MyBatis 整合 Druid 多資料來源Spring BootMyBatisUI
- Spring-Boot 多資料來源配置+動態資料來源切換+多資料來源事物配置實現主從資料庫儲存分離Springboot資料庫
- Spring Boot + Mybatis 多資料來源配置實現讀寫分離Spring BootMyBatis
- Spring Boot 原始碼分析 資料來源 + Mybatis 配置Spring Boot原始碼MyBatis
- Spring Boot入門系列(十四)使用JdbcTemplate運算元據庫,配置多資料來源!Spring BootJDBC
- Spring Boot 2.x基礎教程:MyBatis的多資料來源配置Spring BootMyBatis
- 基於xml的Spring多資料來源配置和使用XMLSpring
- Spring Boot 2.x基礎教程:Spring Data JPA的多資料來源配置Spring Boot
- Spring Boot與多資料來源那點事兒~Spring Boot
- spring-boot-route(十)多資料來源切換Springboot
- Spring Boot 動態資料來源(Spring 註解資料來源)Spring Boot
- Spring系列之多個資料來源配置Spring
- 多資料來源配置
- 談談Spring Boot 資料來源載入及其多資料來源簡單實現Spring Boot
- Spring Boot MyBatis 動態資料來源切換、多資料來源,讀寫分離Spring BootMyBatis
- 基於註解的Spring多資料來源配置和使用Spring
- Spring Boot中的Mongodb多資料來源擴充套件Spring BootMongoDB套件
- Spring+MyBatis多資料來源配置實現SpringMyBatis
- Spring Boot 入門系列(二十三)整合Mybatis,實現多資料來源配置!Spring BootMyBatis
- MyBatis配置多資料來源MyBatis
- web 配置多資料來源Web
- Spring Boot(七):Mybatis 多資料來源最簡解決方案Spring BootMyBatis
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – 資料訪問與多資料來源配置Spring Boot
- Spring Boot 揭祕與實戰(二) 資料儲存篇 - 資料訪問與多資料來源配置Spring Boot
- Spring Boot MyBatis配置多種資料庫Spring BootMyBatis資料庫
- 【教程】Spring+Mybatis環境配置多資料來源SpringMyBatis
- 使用RxJava從多個資料來源獲取資料RxJava
- Spring多資料來源獲取Spring
- 基於註解的Spring多資料來源配置和使用(非事務)Spring
- springboot多資料來源配置Spring Boot