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

Jus*_*tin 5 mysql hibernate jpa hikaricp

我们正在将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)
Run Code Online (Sandbox Code Playgroud)

Jus*_*tin 9

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

Hibernate源代码中的注释说:

"请参阅HHH-9174.对于许多JDBC库,语句#getWarnings可能是一个昂贵的调用.除非日志级别实际上允许记录警告,否则不要这样做."

我将"org.hibernate"上的logback.xml上的日志记录级别提升为ERROR.分析显示SHOW WARNINGS查询不再发布.

这使得业绩略有改善.

我将不胜感激任何关于在这里禁用SHOW WARNINGS实际上是一个好主意的意见.

  • **我建议禁用生产服务器是一个好主意.**它可能在开发/测试环境中证明是有价值的,并且由于数据类型不匹配而发生截断等事情,但如果发生了这种情况,你会发现app/schema不匹配应该考虑防止这种情况发生,而不是在丢失数据后捕获它.对于我所看到的性能问题的一些上下文/数据导致我找到这个答案:[通过tcpdump进行pt-query-digest分析,加载@ 7.8k QPS](http://pastebin.com/N2i1uBHQ) (2认同)