簡體   English   中英

Spring Boot 和 R2DBC:io.r2dbc.spi.R2dbcNonTransientResourceException:連接驗證失敗

[英]Spring Boot and R2DBC: io.r2dbc.spi.R2dbcNonTransientResourceException: Connection validation failed

我正在使用帶有 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 並且以前從未見過這個問題。

是什么導致了連接驗證錯誤,我該如何解決?

謝謝!

事實證明,更新 Postgres 和 R2DBC 依賴項解決了這個問題。 我替換了這個依賴:

implementation 'io.r2dbc:r2dbc-postgresql'

具有這些依賴項:

implementation 'org.postgresql:r2dbc-postgresql:0.9.0.RELEASE'
implementation 'io.r2dbc:r2dbc-pool:0.9.0.RELEASE'
implementation 'io.r2dbc:r2dbc-spi:0.9.1.RELEASE'

請注意,對於r2dbc-postgresql依賴項,組從io.r2dbc更改為org.postgres

R2DBC 池問題中的此評論特別有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM