Que signifie l'avertissement hibernation HHH000387?

je viens de mettre à jour à Hibernate 4.0 et je vois le message d'avertissement:

HHH000387: ResultSet's statement was not registered

dans Mes fichiers journaux. Qu'est-ce que cela signifie, et devrais-je m'inquiéter?

23
demandé sur stevemac 2012-01-04 09:12:47

5 réponses

je ne voudrais pas trop vous inquiéter. Dans tous les cas, il semble qu'il ne soit pas dans les mains des utilisateurs de L'API pour éviter ce message. La journalisation se fait dans l'organisation.hiberner.moteur.jdbc.interne.JdbcResourceRegistryImpl. Selon documentation:

La fonction principale d'un JdbcResourceRegistry est de s'assurer que les ressources obtenir nettoyé.

un bref coup d'oeil au code indique qu'un tel message est enregistré en deux situations:

  1. ResultSet est enregistré via register-method, et statement n'est pas enregistré.
  2. le jeu de résultats est publié via release-method et la déclaration n'est pas enregistrée.
1
répondu Mikko Maunu 2012-05-06 17:08:00

en regardant la source pour le JdbcResourceRegistryImpl classe qui jette cette erreur, je pense personnellement que le fait de l'avoir log au niveau WARN est excessif; il devrait être INFO tout au plus, sauf s'il y a un moyen de tout avoir Statement s implicitement enregistré dans le cadre d'une configuration Hibernate/framework.

C'est pas clair pour moi pourquoi un Statement devrait être enregistré, mais si ce n'est qu'une préoccupation du fonctionnement interne de Hibernate, alors prévenir les utilisateurs de L'API de façon routinière est un bug, non?

1
répondu spume 2012-07-26 10:16:58

Ce message de log est un signe que ResultSet.getStatement() ne renvoie pas le Statement qui a été initialement demandé pour créer le ResultSet. (Cela peut aussi indiquer une fuite de mémoire.) Ceci peut se produire lors de l'utilisation D'un wrapper JDBC, parce qu'il y en a deux Statement objets: un wrapper/décorateur et le sous-jacent Statement.

dans mon projet, j'ai mon propre emballage JDBC à tester. Je fixe cet avertissement dans mon ResultSet envelopper en s'assurant que getStatement() renvoie l'original Statement proxy ( un nouveau proxy), plutôt que de déléguer au sous-jacent ResultSet (qui retournerait le sous-jacent Statement).

tout emballage JDBC produisant des avertissements similaires pourrait probablement utiliser une solution similaire. (Un problème et une solution semblables peuvent s'appliquer à la méthode Statement.getConnection().)

au fait, il y a un rapport de bogue pour cette journalisation ici:https://hibernate.atlassian.net/browse/HHH-8210

1
répondu seanf 2013-07-05 04:08:31

avez-vous configuré le pool de connexion? J'ai le même avertissement. Mais si j'ai ajouté c3p0 dans ma dépendance maven et que je l'ai correctement configuré dans hibernate.cfg.XML. L'avertissement disparaît.

0
répondu Qinghai 2014-03-19 08:30:17

dans mon cas cet avertissement était un indicateur de fuite de performance énorme! J'ai des objets de POJO en hibernation avec une carte de @oneToOne. Pour une table, il fonctionne bien et aucun avertissement: il envoie une requête au serveur MySQl pour obtenir tous les enregistrements et puis pour une requête pour chaque table jointe. Pour POJO où je reçois cette erreur (quand no @oneToOne a trouvé): il envoie une demande initiale pour obtenir une liste de tous les objets et ensuite à chaque fois envoyer de nouvelles et de nouvelles demandes pour les tables mappées pour chaque dossier.

donc, disons que j'ai 2000 enregistrements dans mon test DB. Et 3 @ oneToOne mapped tables.

dans un bon cas, il envoie 1 requête pour obtenir une liste et 3 requêtes pour obtenir des tables mappées.

dans le cas d'un avertissement, il envoie 1 demande initiale pour obtenir la liste. Puis envoyez 3 demandes pour obtenir des informations mappées pour chacun des 2000 enregistrements dans la base de données! So 1999*3 = 5997 requêtes supplémentaires pour chaque utilisateur pour chaque appel au contrôleur @(printemps MVC).

je Je ne l'avais pas remarqué pendant que L'application web et le serveur MySQL étaient sur le même serveur.

0
répondu Yevhenii Tsybaiev 2017-07-19 11:21:14