延緩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原始碼分析 - SpringApplication 啟動類的啟動過程Spring Boot原始碼APP
- Spring Boot 3用CDS提升20%啟動時間Spring Boot
- 再讀Spring原始碼-Spring的啟動和載入Spring原始碼
- 加快Spring Boot啟動的幾種方法 | baeldungSpring Boot
- spring-boot啟動Springboot
- Spring Boot啟動流程Spring Boot
- [20201106]瞭解oracle資料庫啟動時間.txtOracle資料庫
- 精盡Spring Boot原始碼分析 - Jar 包的啟動實現Spring Boot原始碼JAR
- Spring Boot 啟動原始碼解析結合Spring Bean生命週期分析Spring Boot原始碼Bean
- Spring Boot Starters啟動器Spring Boot
- Spring Boot Runner啟動器Spring Boot
- Spring Boot 啟動過程Spring Boot
- Spring啟動過程——原始碼分析Spring原始碼
- [maven][spring boot] mvn spring-boot:run啟動時,指定pom檔案MavenSpring Boot
- 在Spring Boot應用啟動時如何執行程式碼? -DukesletterSpring Boot行程
- Spring Boot啟動流程簡述Spring Boot
- Maven專案Spring Boot啟動MavenSpring Boot
- Spring Boot 2.0(七):Spring Boot 如何解決專案啟動時初始化資源Spring Boot
- Spring MVC 啟動過程原始碼分析SpringMVC原始碼
- Spring原始碼解析02:Spring IOC容器之XmlBeanFactory啟動流程分析和原始碼解析Spring原始碼XMLBean
- 3.1.5.8 隨系統啟動自動啟動資料庫資料庫
- 3.1 啟動資料庫資料庫
- 啟動MySql資料庫MySql資料庫
- 使用 Spring Boot 3.2 和 CRaC 實現更快啟動Spring Boot
- 漲姿勢:Spring Boot 2.x 啟動全過程原始碼分析Spring Boot原始碼
- Spring Boot定製啟動圖案Spring Boot
- Spring Boot(三):Spring Boot中的事件的使用 與Spring Boot啟動流程(Event 事件 和 Listeners監聽器)Spring Boot事件
- spring原始碼閱讀--容器啟動過程Spring原始碼
- Spring啟動過程——原始碼分析(finishBeanFactoryInitialization(beanFactory))Spring原始碼Bean
- 追蹤解析Spring ioc啟動原始碼(2)Spring原始碼
- Spring IOC 容器預啟動流程原始碼探析Spring原始碼
- 在Spring Boot中建立自己的啟動器Spring Boot
- Spring Boot中Tomcat是怎麼啟動的Spring BootTomcat
- 啟動資料庫監聽資料庫
- MySQL資料庫如何啟動?MySql資料庫