2

我正在使用带有 Hibernate 和一些 JDBC 的 WildFly 10。我根本没有日志如果我这样声明我的数据源:

<datasource jta="true" jndi-name="java:jboss/Firebird" pool-name="FirebirdPool" enabled="true" spy="true" use-ccm="true" statistics-enabled="false">
<connection-url>jdbc:firebirdsql:localhost/3050:C:\banco\COMPLEXO140116.FDB</connection-url>

但如果我宣布通过:

?defaultResultSetHoldable=True&amp;encoding=WIN1252

它记录

09:54:00,384 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper(默认任务 3)SQL 警告代码:0,SQLState:01000

09:54:00,384 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务 3)空

在每个查询

4

1 回答 1

3

日志记录是由 Hibernate 完成的,而不是由 Firebird 或 Jaybird 完成的。发生这种情况的原因是因为您指定了defaultResultSetHoldable=True. 此设置将使所有语句具有可保持性HOLD_CURSORS_OVER_COMMIT。在 JaybirdHOLD_CURSORS_OVER_COMMIT中是通过 using 实现的TYPE_SCROLL_INSENSITIVE,但默认是TYPE_FORWARD_ONLY,因此 Jaybird 升级了结果集类型,并且符合 JDBC 规范(JDBC 4.2 的第 15.1.1 节),这会注册一个警告,然后由 Hibernate 记录。

如果驱动程序不支持提供给方法createStatementprepareStatement或的类型prepareCall,它会SQLWarning在创建语句的 Connection 对象上生成一个。

不幸的是,SQLWarningJaybird 使用的子类中的一个错误导致消息null而不是实际消息(“Holdable result set must be scrollable.”)。

您的选项是不指定defaultResultSetHoldable=True或配置 Hibernate 以不使用配置属性记录警告hibernate.jdbc.log.warnings=false

出于好奇:你为什么要指定defaultResultSetHoldable=True?这是一个可能对性能不利的选项,因为它将整个结果集缓存在驱动程序中,并且它主要用作尝试在(自动)提交后访问结果集的应用程序的解决方法。

于 2016-03-05T09:01:19.277 回答