为什么在这里发出’SHOW WARNINGS’查询? (JPA /休眠/ MySQL的)

我们正在将Java模板的持久层从JDBC模板重构为JPA / Hibernate.

我正在分析发给数据库的SQL语句,我看到很多次发出“SHOW WARNINGS”.据JProfiler称,“SHOW WARNINGS”占据了相当数量的“固有时间”.

什么可能导致SHOW WARNINGS频繁发布?

使用Jdbc模板时,以前未发布此SHOW WARNINGS.

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

> JPA / Hibernate:4.3.6
> MySQL驱动程序:5.1.33
> MySQL数据库:5.6.20
> JDBC连接池:HikariCP-2.3.2

编辑:这是发布SHOW WARNINGS时的示例堆栈跟踪.

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实际上是一个好主意的意见.

转载注明原文:为什么在这里发出’SHOW WARNINGS’查询? (JPA /休眠/ MySQL的) - 代码日志