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.fdb
、myuser
和 mypassword
,但这些设置工作正常。
原因是 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 的维护者之一。
我正在开发一个 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.fdb
、myuser
和 mypassword
,但这些设置工作正常。
原因是 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 的维护者之一。