2015-06-18 17 views
5

Stiamo rifattorizzando il livello di persistenza di un'applicazione Java da JDBC Template a JPA/Hibernate.Perché la query "SHOW WARNINGS" è stata emessa qui? (JPA/Hibernate/MySQL)

Sto profilando le istruzioni SQL rilasciate nel database e vedo "SHOW WARNINGS" è stato emesso molte, molte volte. Secondo JProfiler, "SHOW WARNINGS" rappresenta una notevole quantità di "tempo intrinseco".

Che cosa potrebbe causare SHOW WARNINGS da rilasciare così frequentemente?

Questo SHOW WARNINGS NON è stato precedentemente emesso quando si utilizza Jdbc Template.

Di seguito è riportata la parte del nostro stack relativa alla persistenza. L'unico cambiamento qui è l'introduzione di JPA/Hibernate.

  • JPA/Hibernate: 4.3.6
  • MySQL conducente: 5.1.33
  • Database MySQL: 5.6.20
  • JDBC Connection Pool: HikariCP-2.3.2

EDIT : Ecco una traccia dello stack di esempio di quando viene emesso 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) 
+0

Sei incappato in come sopprimere gli avvisi? – Drew

+0

Stai eseguendo MySQL con l'opzione '--show-warnings'? – DuncanKinnear

+0

Puoi pubblicare la configurazione xml della tua unità di persistenza? – DuncanKinnear

risposta

7

Questo è PERCHE spettacolo avvertimenti viene emesso: org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings() sta chiamando com.mysql.jdbc.StatementImpl.getWarnings().

Un commento nel codice sorgente di Hibernate dice:..

"See HHH-9174 Dichiarazione # getWarnings può essere una chiamata costosa per molte librerie JDBC Non farlo a meno che il livello di registro sarebbe in realtà consentire un avviso da registrare. "

Ho aumentato il livello di registrazione su logback.xml su "org.hibernate" su ERRORE. Il profilo mostra la query SHOW WARNINGS non è più in corso di rilascio.

Ciò ha comportato un miglioramento marginale delle prestazioni.

Apprezzerei qualsiasi input sul fatto se sia effettivamente una buona idea disabilitare AVVISI MOSTRE qui.

+2

** Suggerirei che sia una buona idea disabilitare per un server di produzione.** Potrebbe rivelarsi prezioso in un ambiente di sviluppo/test e catturare cose come il troncamento a causa di mancate corrispondenze di tipo di dati, ma se ciò accade si verificano disallineamenti app/schema e probabilmente si dovrebbe cercare di impedire che ciò accada piuttosto che catturarlo dopo aver perso dati. Per alcuni contesti/dati sui problemi di prestazioni che stavo vedendo che mi hanno portato a trovare questa risposta: [analisi pt-query-digest tramite tcpdump, carico @ 7.8k QPS] (http://pastebin.com/N2i1uBHQ) – pickles

+0

Ciao Justin, hai qualche possibilità di condividere la parte importante del tuo logback.xml? Ho lo stesso problema mentre è presente nel mio logback.xml –

+0

\t \t Justin