我正在使用带有 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 并且以前从未见过这个问题。
是什么导致了连接验证错误,我该如何解决?
谢谢!