我想用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 。
1条答案
按热度按时间bweufnob1#
是的,确实需要为依赖于数据源的bean添加“depends-on”。请注意文件的以下部分:
通过依赖于数据库启动的bean的“depends-on”引用,比如hibernate sessionfactory或直接访问数据源的自定义数据访问对象。
如果我理解得很好,这意味着
EntityManagerFactory
依赖数据库的人现在必须通过DatabaseStartupValidator
bean并等待db启动。我不知道是什么导致了你的异常,但通常有一个EntityManagerFactory
所以至少要尝试在这个对象上添加dependson。链接文章就是这样做的:
你不一定有
Flyway
配置,但需要注意的是依赖项本身由bean名称引用databaseStartupValidator
它是创建bean的方法的名称。