12
votes

Comment surveiller les requêtes SQL lentes exécutées par JPA et Hibernate

Y a-t-il une propriété hibernate que je pourrais définir pour voir toutes les requêtes lentes? Je suis intéressé par les requêtes qui prennent trop de temps pour renvoyer le jeu de résultats.

J'utilise le ressort avec hibernate, configuré via un fichier ApplicationContexT.xml fichier de configuration du ressort.


0 commentaires

4 Réponses :


2
votes

Vous pouvez activer la journalisation de tous les SQL dans l'hibernate en définissant la propriété hibernate.show_sql à true (voir http://www.javalbobbobby.org/java/forums/t44119.html ). Cependant, il n'y a aucun moyen de filtrer pour seulement voir des requêtes lentes. Toutefois, si vous utilisez MySQL, vous pouvez activer son journal de requête lente et voir les requêtes plus lentes qu'un seuil défini là-bas.

voir: http://adminlinux.blogspot.com /2009/07/mysql-slow-queries-log.html

Je suis sûr que la plupart des autres bases de données offriront une caractéristique similaire.


2 commentaires

Je cherche un moyen de voir le temps nécessaire pour exécuter la requête SQL. show_sql ne montre que SQL, sans montrer l'exécution du temps


Ayez une lecture à travers cela, espérons-le, il peut éclairer une lumière sur les requêtes de temps avec Oracle: DBA- oracle.com/t_measure_sql_Response_Time.htm



7
votes

J'ai 2 suggestions:

  • Vous pouvez utiliser la statispack d'Oracle.
  • Vous pouvez utiliser une sorte de temps de journalisation du pilote de proxy JDBC p6spy ou log4jdbc .

    J'ai utilisé P6Spy et Irontrack SQL de Irongrid dans le passé et c'était un combo décent (voir Ce blog post ). Mais notez que:

    • P6SPY n'est pas vraiment entretenu (5 ans sans changement).
    • Les mesures n'étaient pas totalement précises (ce n'est pas un énorme problème lors de la poursuite de porcs gourmands).
    • Irontrack SQL ne semble plus être disponible (mais vous pouvez toujours le trouver, par exemple ici ).

      J'utilise personnellement log4JDBC MAINTENANT qui fournit des caractéristiques similaires (sans l'interface graphique fantaisie mais Qui se soucie, utilisez Excel ou le script qu'ils fournissent pour produire un rapport). De son site Web:

      Caractéristiques
      • Prise en charge complète pour JDBC 3 et JDBC 4!
      • Facile à configurer, dans la plupart des cas, tout ce que vous avez à faire est de changer le conducteur. Nom de classe à net.sf.log4jdbc.driverspy et prépendez-vous "JDBC: log4" à votre URL JDBC existante, Configurez vos catégories de journalisation et Vous êtes prêt à partir!
      • dans la sortie enregistrée, pour des déclarations préparées, les arguments de liaison sont automatiquement inséré dans le SQL production. Cela améliore considérablement lisibilité et débogage pour beaucoup cas.
      • Les informations de synchronisation SQL peuvent être générées pour aider à identifier le temps Les déclarations SQL prennent pour courir, aidant à Identifier les déclarations qui fonctionnent trop lentement et ces données peuvent être post traité avec un outil inclus pour produire des données de rapport de profilage pour identifier rapidement SLOW SQL dans votre application .
      • Numéro de connexion SQL Les informations sont générées pour aider à identifier la connexion des problèmes de mise en commun ou de filetage.
      • fonctionne avec tout pilote JDBC sous-jacent, avec JDK 1.4 et plus, et Slf4j 1.x.
      • Logiciel Open Source, sous licence sous l'Apache amical des affaires 2.0 Licence: http://www.apache.org/licenses/license-2.0


1 commentaires

Une mise à jour de votre message: P6Spy regarde maintenant entretenu et avait reçu de nombreux commits au cours des dernières années.



1
votes

Ceci a été Ajout de manière native dans Hibernate 5.4.5.final . Le paramètre de configuration est disponible à DispontablesETTS.LOG_SLOW_QUERY .

La description est la suivante:

paramètre qui enregistre la requête qui a exécuté plus lentement que spécifié millisecondes. La valeur par défaut est 0 (désactivé).


0 commentaires

18
votes

Hibernate 5.4

Cette fonctionnalité de journal de requête lente est disponible car hibernate ORM 5.4.5 et vous avertit lorsque l'heure d'exécution d'une requête d'exécution JPQL, API de critère ou native SQL dépasse une certaine valeur que vous avez configurée. P>

Configuration H2>

Pour activer le journal de requête lente Hibernate, vous devez définir le hibernate.session.events.log.log_queries_slower_than_ms code> propriété sur une valeur c'est supérieur à 0 code>, représentant le seuil d'exécution de la requête. p>

Dans notre cas, toute requête qui prend plus que 25 code> millisecondes déclenchera la requête lente hibernate Journal. P>

La configuration de démarrage à ressort h3>

Si vous utilisez un démarrage à ressort, vous pouvez définir ce paramètre hibernate dans le fichier application.properties code> fichier de configuration: xxx pré>

la configuration Java ee h3>

Si vous utilisez Java EE, vous pouvez la définir dans la configuration persistence.xml code> configuration Fichier: P>

o.h.SQL_SLOW -
    SlowQuery: 27 milliseconds.
    SQL: 'PgPreparedStatement [
        SELECT
            p.*
        FROM post
            p
        WHERE
            LOWER(p.title) LIKE '%java%book%review%'
        ORDER BY p.created_on DESC
        LIMIT 100
        OFFSET 1000
    ]'


3 commentaires

Pourquoi voir les requêtes lentes dans les journaux, je dois activer hibernate.show_sql drapeau? Sinon, le journal lent ne fonctionne pas. N'a-t-il pas vaincu le but? Cela ne va-t-il pas connecter chaque question de cette façon?


Vous n'avez pas besoin d'activer hibernate.show_sql . Qui imprime les requêtes de la console, pas le journal. Ceci SlowQuéryLogTest dans mon référentiel GitHub le prouve.


Je l'ai travaillé, j'avais défini le niveau de journalisation à l'avertissement, aurait dû être des informations.