天天看點

SpringBoot啟動時HikariCP不建立連接配接池問題解決方案

我們直接進入主題。
通常情況下,我們SpringBoot項目啟動完成時,HikariCP都會建立連接配接池。
我們在控制台的日志中就能直接看到這個資訊:
com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
           
但是有些項目,在啟動時,并沒有立即建立連接配接,而是按需建立連接配接。這樣就會導緻,我們資料庫配置一旦有錯誤,我們不能在第一時間發現問題。
查閱一些資料,也有人遇到了相似的問題,通過spring-boot版本降級得到了解決。但我嘗試從2.2.X降級到2.1.X并沒有解決問題。
經過一些讨論,得到了2個相關的解決方案
issue位址:https://github.com/spring-projects/spring-boot/issues/19596
HikariCP本身就是按需建立連接配接,并不會在項目啟動時,直接建立。如果我們想在程式啟動時建立連接配接,SpringBoot相關人員給出了2個方案。

方案一:

@Bean
    public ApplicationRunner runner(DataSource dataSource) {
        return args -> {
            log.info("dataSource: {}", dataSource);
            Connection connection = dataSource.getConnection();
            log.info("connection: {}", connection);
        };
    }
           
我們手動建立一個Bean,啟動時我們強制getConnection,來達到啟動時建立連接配接池的目的。

方案二

@Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://xxx.xxx.xxx.xxx:3306/demos?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");
        config.setUsername("root");
        config.setPassword("xxxxxxxxx");
        config.setXxx("xxx");
        config.setYyy("yyy");
        config.setZzz("zzz");
        return new HikariDataSource(config);
    }
           
這個需要我們手動建立DataSource,而且是根據HikariConfig來建立,這樣才可以在初始化DataSource的時候,建立連接配接池。