延緩Spring Boot啟動時間直到資料庫啟動的方法和原始碼 - Marten
當使用Spring Boot或僅使用普通的Spring Framework時,可能要延遲應用程式的啟動,直到可以與資料庫建立正確的連線為止。當使用容器技術(例如Docker)時,情況可能更是如此。
DatabaseStartupValidator會延遲應用程式的進一步啟動,直到可以建立與資料庫的連線為止。預設情況下,它將每秒嘗試連線到資料庫,並僅捕獲異常。它將嘗試60秒,此後如果無法建立連線,則失敗(所有這些屬性都是可配置的)。
要使用它,只需宣告一個bean並注入資料來源。您定義一個驗證查詢(從Spring 5.3開始,它將isValid預設使用JDBC 4 方法!)。Spring Boot附帶了一個方便的列舉,該列舉已經包含針對一系列受支援資料庫的預設驗證查詢(由Spring Boot Actuator中的執行狀況檢查使用)。
@SpringBootApplication public class DatabaseUpApplication { public static void main(String[] args) { SpringApplication.run(DatabaseUpApplication.class, args); } @Bean public DatabaseStartupValidator databaseStartupValidator(DataSource dataSource) { var dsv = new DatabaseStartupValidator(); dsv.setDataSource(dataSource); dsv.setValidationQuery(DatabaseDriver.POSTGRESQL.getValidationQuery()); return dsv; } } |
但是,僅定義此bean可能還不夠,需要更多配置。有許多依賴DataSource 的beans如EntityManagerFactory,Flyway 或 JdbcTemplate ,需要手工增加@DependsOn在這些@Bean方法上:可通過Spring Boot進行一些自動配置,也可以使用a BeanFactoryPostProcessor來修改bean
@Bean public static BeanFactoryPostProcessor dependsOnPostProcessor() { return bf -> { // Let beans that need the database depend on the DatabaseStartupValidator // like the JPA EntityManagerFactory or Flyway String[] flyway = bf.getBeanNamesForType(Flyway.class); Stream.of(flyway) .map(bf::getBeanDefinition) .forEach(it -> it.setDependsOn("databaseStartupValidator")); String[] jpa = bf.getBeanNamesForType(EntityManagerFactory.class); Stream.of(jpa) .map(bf::getBeanDefinition) .forEach(it -> it.setDependsOn("databaseStartupValidator")); }; } |
這裡延緩了Flyway 和 EntityManagerFactory執行,直到DatabaseStartupValidator 完全初始化。
相關文章
- spring boot 不連線資料庫啟動Spring Boot資料庫
- Spring Boot原始碼分析-啟動過程Spring Boot原始碼
- 使用lazyInit縮短Spring Boot啟動時間Spring Boot
- Spring Boot 3用CDS提升20%啟動時間Spring Boot
- 精盡Spring Boot原始碼分析 - SpringApplication 啟動類的啟動過程Spring Boot原始碼APP
- 啟動和停止資料庫.資料庫
- Spring Boot啟動流程Spring Boot
- spring-boot啟動Springboot
- 加快Spring Boot啟動的幾種方法 | baeldungSpring Boot
- 精盡Spring Boot原始碼分析 - Jar 包的啟動實現Spring Boot原始碼JAR
- 再讀Spring原始碼-Spring的啟動和載入Spring原始碼
- 資料庫的啟動資料庫
- 資料庫啟動和關閉資料庫
- Spring Boot 啟動過程Spring Boot
- Spring Boot Starters啟動器Spring Boot
- Spring Boot Runner啟動器Spring Boot
- Spring Boot 啟動原始碼解析結合Spring Bean生命週期分析Spring Boot原始碼Bean
- mysql 的原始碼安裝方法及自動啟動方法MySql原始碼
- Spring原始碼系列:Spring的啟動過程Spring原始碼
- Oracle資料庫的啟動和關閉Oracle資料庫
- 資料庫啟動時的判斷條件資料庫
- Spring啟動過程——原始碼分析Spring原始碼
- 在Spring Boot應用啟動時如何執行程式碼? -DukesletterSpring Boot行程
- 3.1.5.8 隨系統啟動自動啟動資料庫資料庫
- 利用dbstart和dbshut指令碼自動啟動和停止資料庫的問題指令碼資料庫
- Spring Boot啟動流程簡述Spring Boot
- Maven專案Spring Boot啟動MavenSpring Boot
- 3.1 啟動資料庫資料庫
- 啟動MySql資料庫MySql資料庫
- 啟動MongoDB資料庫MongoDB資料庫
- [maven][spring boot] mvn spring-boot:run啟動時,指定pom檔案MavenSpring Boot
- 【指令碼】快速啟動和關閉Windows上的資料庫指令碼Windows資料庫
- ORACLE資料庫的啟動和關閉(轉)Oracle資料庫
- dataguard standby資料庫的關閉和啟動資料庫
- Spring Boot 2.0(七):Spring Boot 如何解決專案啟動時初始化資源Spring Boot
- Spring MVC 啟動過程原始碼分析SpringMVC原始碼
- Spring Boot 啟動原理解析(二) Tomcat 啟動詳解Spring BootTomcat
- informix 資料庫啟動關閉指令碼ORM資料庫指令碼