首页 > 解决方案 > Spring Boot 和 R2DBC:io.r2dbc.spi.R2dbcNonTransientResourceException:连接验证失败

问题描述

我正在使用带有 WebFlux 和 R2DBC 的 Spring Boot 2.4.9,使用标准 Netty 服务器进行部署。数据库是 PostgreSQL。应用程序中只有一个 R2DBC 存储库类。

R2DBC 配置application.properties有以下属性:

spring.r2dbc.username=xxx
spring.r2dbc.password=yyy
spring.r2dbc.url=r2dbc:postgresql://$host:port/database

根据文档,连接池是自动配置的,因为r2dbc:pool它位于类路径上。

使用存储库类时,我们偶尔会遇到此异常:

org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection; nested exception is io.r2dbc.spi.R2dbcNonTransientResourceException: Connection validation failed
    at org.springframework.r2dbc.connection.ConnectionFactoryUtils.lambda$getConnection$0(ConnectionFactoryUtils.java:88)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ Handler com.myco.ManagementController#viewMessages() [DispatcherHandler]
    |_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ HTTP GET "/management/management-messages" [ExceptionHandlingWebHandler]
Stack trace:
        at org.springframework.r2dbc.connection.ConnectionFactoryUtils.lambda$getConnection$0(ConnectionFactoryUtils.java:88)
        at reactor.core.publisher.Mono.lambda$onErrorMap$31(Mono.java:3676)
        at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
        at 

(堆栈中还有更多内容,但这似乎是相关的)

嵌套io.r2dbc.spi.R2dbcNonTransientResourceException: Connection validation failed似乎是罪魁祸首,但我已经搜索和搜索,无法弄清楚我可能做错了什么。

如果它有帮助的话,应用程序确实使用了这些属性,它们指向同一个数据库,并且仅用于提供到 Flyway bean 的常规 JDBC 连接:

spring.datasource.username=xxx
spring.datasource.password=yyy
spring.datasource.url=jdbc:postgresql://host:port/database

以防万一这可能会干扰 R2DBC,但我无法想象我会这样做。

此外,似乎在应用程序服务器第一次启动后,前 10 分钟左右我们看不到错误,但之后会开始出现错误。该错误也只是偶尔发生;它不会一直发生。

我可以在我的工作站上重现错误的唯一方法是停止并重新启动运行 PostgreSQL 的 Docker 容器,同时让应用程序服务器一直运行。然后我得到同样的错误,但是错误是持久的并且每次都会发生,在我们的生产环境中,错误是间歇性的。

我在其他生产应用程序(但那些使用 MySQL)上使用过 Spring Boot + R2DBC 并且以前从未见过这个问题。

是什么导致了连接验证错误,我该如何解决?

谢谢!

标签: spring-bootspring-data-r2dbcr2dbcr2dbc-postgresql

解决方案


推荐阅读