为什么'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.
- JPA/休眠:4.3.6
- MySQL驱动程序:5.1.33
- MySQL 数据库:5.6.20
- JDBC连接池:HikariCP-2.3.2
编辑:这是发出显示警告时的堆栈跟踪示例。
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' 语句污染数据库
我们正在将 Java 应用程序的持久层从 JDBC 模板重构为 JPA/Hibernate。
我正在分析向数据库发出的 SQL 语句,我发现 "SHOW WARNINGS" 发出了很多很多次。根据 JProfiler,"SHOW WARNINGS" 占相当数量的 'inherent time'。
什么会导致如此频繁地发出 SHOW WARNINGS?
此显示警告之前未在使用 Jdbc 模板时发出。
下面是我们堆栈中与持久性相关的部分。这里唯一的变化是引入了 JPA/Hibernate.
- JPA/休眠:4.3.6
- MySQL驱动程序:5.1.33
- MySQL 数据库:5.6.20
- JDBC连接池:HikariCP-2.3.2
编辑:这是发出显示警告时的堆栈跟踪示例。
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' 语句污染数据库