为什么'SHOW WARNINGS'查询在这里发出? (JPA/Hibernate/MySQL)

Why is 'SHOW WARNINGS' query issued here? (JPA/Hibernate/MySQL)

我们正在将 Java 应用程序的持久层从 JDBC 模板重构为 JPA/Hibernate。

我正在分析向数据库发出的 SQL 语句,我发现 "SHOW WARNINGS" 发出了很多很多次。根据 JProfiler,"SHOW WARNINGS" 占相当数量的 'inherent time'。

什么会导致如此频繁地发出 SHOW WARNINGS?

此显示警告之前未在使用 Jdbc 模板时发出。

下面是我们堆栈中与持久性相关的部分。这里唯一的变化是引入了 JPA/Hibernate.

编辑:这是发出显示警告时的堆栈跟踪示例。

com.mysql.jdbc.StatementImpl.getWarnings()
com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy.getWarnings()
org.hibernate.jpa.internal.QueryImpl.getSingleResult()
com.mysema.query.jpa.impl.AbstractJPAQuery.getSingleResult(javax.persistence.Query)
com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult()
com.mysema.query.jpa.impl.AbstractJPAQuery.uniqueResult(com.mysema.query.types.Expression)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[ ])
com.sun.proxy.$Proxy115.findOne(com.mysema.query.types.Predicate)

这是为什么显示正在发出警告: org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings() 正在呼叫 com.mysql.jdbc.StatementImpl.getWarnings()

Hibernate 源代码中的注释说:

"See HHH-9174. Statement#getWarnings can be an expensive call for many JDBC libs. Don't do it unless the log level would actually allow a warning to be logged."

我在 "org.hibernate" 上将 logback.xml 上的日志记录级别提高到 ERROR。分析显示不再发出 SHOW WARNINGS 查询。

这在性能上略有改善。

我将不胜感激任何关于在此处禁用 SHOW WARNINGS 是否真的是个好主意的意见。

这对 payara 和 log4j 都不起作用,hibernate 仍在使用 'show warnings' 语句污染数据库