首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring中毫无例外地等待数据库连接

在Spring中毫无例外地等待数据库连接
EN

Stack Overflow用户
提问于 2021-04-07 19:37:16
回答 2查看 1.9K关注 0票数 4

我想用Spring创建一个微服务。为了持久化,我使用了一个mariadb数据库。为了等待在docker容器中运行的数据库,我实现了如下代码,如所示的这里

代码语言:javascript
复制
@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;
    }

代码运行良好,我的应用程序正在等待数据库连接。但是,在启动应用程序时,我得到了一个例外:

代码语言:javascript
复制
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“函数吗?我必须使用哪种依赖?抱歉,可能是个愚蠢的问题,我刚开始穿春靴。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-17 14:22:09

要消除该异常,可以在application.properties文件中声明以下指令:

代码语言:javascript
复制
logging.level.com.zaxxer.hikari=OFF

请记住,如果应用程序无法与数据库取得联系,那么您的spring将在一段时间后由于该异常而崩溃。此外,上面的指令阻止您看到任何与Hikari相关的日志活动。

总之,您将隐藏异常的外观,直到应用程序因超时而死亡之前才有可能。

希望我能澄清这件事

票数 1
EN

Stack Overflow用户

发布于 2021-04-07 19:50:36

的确,您需要为依赖于数据源的bean添加“依赖-依赖”。注意文档的以下部分

要通过依赖于数据库启动的bean进行引用,比如Hibernate SessionFactory或直接访问DataSource的自定义数据访问对象。

如果我对此有很好的理解,这意味着依赖于数据库的bean (如EntityManagerFactory )现在必须遍历DatabaseStartupValidator bean并等待DB启动。我不知道是什么导致了您的异常,但是通常需要一个EntityManagerFactory,所以至少尝试在这个对象上添加DependsOn。

链接文章就是这样做的:

代码语言:javascript
复制
@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的方法的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66993064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档