java—在spring boot中等待数据库连接,没有异常

4ngedf3f  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(247)

我想用spring boot创建一个微服务。对于持久性,我使用mariadb数据库。为了等待在docker容器中运行的数据库,我实现了如下代码:

@Bean
    public DatabaseStartupValidator databaseStartupValidator(DataSource dataSource) {
        var dsv = new DatabaseStartupValidator();
        dsv.setDataSource(dataSource);
        dsv.setTimeout(60);
        dsv.setInterval(7);
        dsv.setValidationQuery(DatabaseDriver.MYSQL.getValidationQuery());
        return dsv;
    }

代码运行得很好,我的应用程序正在等待数据库连接。但我在启动应用程序时遇到一个异常:

java.sql.SQLNonTransientConnectionException: Could not connect to Host ....
...
...
...

在下一行中,我得到一个信息,它将等待数据库: 021-04-07 21:29:40.816 INFO 16569 --- [ main] o.s.j.support.DatabaseStartupValidator : Database has not started up yet - retrying in 7 seconds (timeout in 57.65 seconds) 之后,应用程序将按预期启动。所以我认为一切都很好,但是我要做什么来抑制异常呢?在链接的文章中,它应该毫无例外地起作用。我必须实现“dependsonpostprocessor”函数吗?我必须使用哪种依赖关系?对不起,可能是一个愚蠢的问题,我是新来的Sping Boot 。

bweufnob

bweufnob1#

是的,确实需要为依赖于数据源的bean添加“depends-on”。请注意文件的以下部分:
通过依赖于数据库启动的bean的“depends-on”引用,比如hibernate sessionfactory或直接访问数据源的自定义数据访问对象。
如果我理解得很好,这意味着 EntityManagerFactory 依赖数据库的人现在必须通过 DatabaseStartupValidator bean并等待db启动。我不知道是什么导致了你的异常,但通常有一个 EntityManagerFactory 所以至少要尝试在这个对象上添加dependson。
链接文章就是这样做的:

@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 配置,但需要注意的是依赖项本身由bean名称引用 databaseStartupValidator 它是创建bean的方法的名称。

相关问题