我想用Spring创建一个微服务。为了持久化,我使用了一个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“函数吗?我必须使用哪种依赖?抱歉,可能是个愚蠢的问题,我刚开始穿春靴。
发布于 2021-08-17 14:22:09
要消除该异常,可以在application.properties文件中声明以下指令:
logging.level.com.zaxxer.hikari=OFF请记住,如果应用程序无法与数据库取得联系,那么您的spring将在一段时间后由于该异常而崩溃。此外,上面的指令阻止您看到任何与Hikari相关的日志活动。
总之,您将隐藏异常的外观,直到应用程序因超时而死亡之前才有可能。
希望我能澄清这件事
发布于 2021-04-07 19:50:36
的确,您需要为依赖于数据源的bean添加“依赖-依赖”。注意文档的以下部分
要通过依赖于数据库启动的bean进行引用,比如Hibernate SessionFactory或直接访问DataSource的自定义数据访问对象。
如果我对此有很好的理解,这意味着依赖于数据库的bean (如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的方法的名称。
https://stackoverflow.com/questions/66993064
复制相似问题