FBDriver 报告警告我不知道如何修复

FBDriver reporting warnings I can't figure out how to fix

我正在开发一个 RESTful 应用程序,每当我发出请求时,它都能正常工作,但也会输出以下警告:

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Warning Code: 0, SQLState: null
o.h.engine.jdbc.spi.SqlExceptionHelper   : Connection.isValid does not support non-zero timeouts, timeout value 5 has been ignored

将 Spring 引导框架与 Hibernate、HikariCP、QueryDSL 和使用 Jaybird 4.0.5 的 Firebird 数据库一起使用。java11 版本。

这是我的 application.yml 文件,我在其中设置了与我的数据库的连接:

spring:
  datasource:
    driver-class-name: org.firebirdsql.jdbc.FBDriver
    url: jdbc:firebirdsql://localhost:3050/C:\path\to\my\database.fdb?encoding=win1252
    username: myuser
    password: mypassword
    hikari:
      connection-timeout: 1000
      login-timeout: 1000
      minimum-idle: 10

  jpa:
    database-platform: org.hibernate.dialect.FirebirdDialect
    hibernate:
      ddl-auto: validate

我已经尝试了所有可以设置超时的选项,但其中 none 使超时警告消失了。

此外,我无法弄清楚 SQL 警告代码:0,从我目前收集到的信息来看,这意味着它有效,但为什么会输出警告?

我应该提一下,我已经更改了一些敏感信息并将它们替换为 path\to\my\database.fdbmyusermypassword,但这些设置工作正常。

原因是 Jaybird 目前不支持 Connection.isValid(int) and ignores it, and thus - if the specified timeout is non-zero - it registers a SQLWarning 连接超时(而不是抛出异常)。尽管在 JDBC 规范中未指定在此处注册警告,但这类似于 JDBC 要求驱动程序在配置结果集类型时 replaces/ignores 用户指定的值时执行的操作,并发性和可持有性。

当 Hibernate 注意到连接上注册了一个警告时,它将在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper 中记录该警告。可以通过设置 属性 hibernate.jdbc.log.warnings=false 来禁用这种警告记录(请参阅 Hibernate 文档中的 Query Settings)。在 Spring Boot 的情况下,我想你可以将其设置为 属性 spring.jpa.properties.hibernate.jdbc.log.warnings (但我尚未验证这一点)。

超时可通过 HikariCP 属性 validationTimeout 配置,但是 - 默认情况下 - 这不接受低于 250 毫秒的值(您可以使用系统 属性 com.zaxxer.hikari.timeoutMs.floor)。或者,您可以使用 - 例如 - select 1 from rdb$database 配置 HikariCP 属性 connectionTestQuery,因此 HikariCP 使用测试查询而不是 Connection.isValid(int)。请注意,测试查询的开销更大。

打印的警告代码是 SQLWarning.getErrorCode()(技术上,SQLException.getErrorCode(),a.k.a 供应商代码)。鉴于此警告没有 error/warning 代码,其值为 0,这仅表示 “没有与此警告关联的特定供应商代码”.

我创建了 this issue 以查看是否可以在 Jaybird 4.0.6 或 Jaybird 5 中添加实际的超时支持。

披露:我是 Jaybird 的维护者之一。