为什么在此发布“SHOW WARNINGS”查询? (JPA /休眠/ MySQL的) [英] Why is 'SHOW WARNINGS' query issued here? (JPA/Hibernate/MySQL)

查看:365
本文介绍了为什么在此发布“SHOW WARNINGS”查询? (JPA /休眠/ MySQL的)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

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

这个SHOW WARNINGS在使用Jdbc模板时以前没有发布。



以下是我们的堆栈与持久性相关。 JPA / Hibernate:4.3.6


  • JPA / Hibernate:4.3.6
  • li> 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)


    解决方案

    这是 WHY 显示警告正在发布:
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings()正在调用 com.mysql.jdbc.StatementImpl.getWarnings()



    Hibernate源代码中的注释说:


    请参阅HHH-9174。语句#getWarnings对于
    许多JDBC库很贵。不要这样做,除非日志级别实际上允许记录
    a警告。


    我调高了日志级别将org.hibernate上的logback.xml复制到ERROR中。分析显示SHOW WARNINGS查询的执行时间不长。



    这在性能上略有提升。 p>

    如果在这里禁用SHOW WARNINGS是否是一个好主意,我将不胜感激。


    We are refactoring the persistence layer of a Java application from JDBC Template to JPA/Hibernate.

    I am profiling the SQL statements being issued to the database and I see "SHOW WARNINGS" is issued many, many times. According to JProfiler the "SHOW WARNINGS" is accounting for a considerable amount of 'inherent time'.

    What could cause SHOW WARNINGS to be issued so frequently?

    This SHOW WARNINGS was NOT previously issued when using Jdbc Template.

    Below is the part of our stack relevant to persistence. The only change here is the introduction of JPA/Hibernate.

    • JPA / Hibernate: 4.3.6
    • MySQL driver: 5.1.33
    • MySQL database: 5.6.20
    • JDBC Connection Pool: HikariCP-2.3.2

    EDIT: Here's a sample stack trace of when SHOW WARNINGS is issued.

    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)
    

    解决方案

    This is WHY show warnings is being issued: org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings() is calling com.mysql.jdbc.StatementImpl.getWarnings().

    A comment in the Hibernate source code says:

    "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."

    I upped the logging level on logback.xml on "org.hibernate" to ERROR. Profiling shows SHOW WARNINGS query is NO LONGER being issued.

    This has made a marginal improvement in performance.

    I would appreciate any input as to whether it is actually a good idea to disable SHOW WARNINGS here.

    这篇关于为什么在此发布“SHOW WARNINGS”查询? (JPA /休眠/ MySQL的)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆