Spring Boot 2 的默认数据库连接池切换到了相对而言更简洁速度更快的 HiKariCP,但是 HikariCP 是按需初始化的,启动应用后如果没有数据库的相关操作,连接池永远都不会初始化,直到第一次的使用时才会临时初始化,虽然初始化所需要的时间不长,但是在分布式的环境下首次访问可能会因为响应超时而触发降级熔断,这就非常不友好了。
查找后发现 Spring Boot 2 中有关于懒加载的这么一项配置 spring.main.lazy-initialization
,实际上这个配置是默认值是 false ,所以延迟初始化的影响并不是这个,并且启用全局延迟初始化后会所有的 Bean 都会受到影响而使用延迟初始化。
到项目 GitHub 仓库中搜索才知道这是因为按需加载和延迟加载并没有任何关系,目前并没有提供修改相关配置的选项,但可以使用 Spring Boot 的 ApplicationRunner 曲线救国,定义一个类启动后调用获取连接的相关方法即可。
@Component
public class DataSourceRunner implements ApplicationRunner {
private final HikariDataSource dataSource;
//这里需要使用构造函数或者 ApplicationContextAware 进行初始化,否则直接 new 出来的 HikariDataSource 对象会报空指针
public DataSourceRunner(HikariDataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void run(ApplicationArguments args) {
try {
dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}