2009-08-31 5 views
2

Un objet avec un membre de données de session d'hibernation lorsque le garbage est collecté, la connexion jdbc de la session est-elle fermée? En d'autres termes est de quitter la session de clôture à la mauvaise idée de collecteur de déchets?Session Hibernate et ramasse-miettes

Répondre

2

Vous devriez toujours fermer explicitement les ressources, et ne pas compter sur GC/finalisation.

0

complètement d'accord avec @Robert. On ne saurait trop insister sur le fait que les objets de session Hibernate doivent être traités avec le même soin qu'une connexion JDBC, vous devez savoir quand et où il est ouvert et quand et où il est fermé dans tous les cas. Ceci est bien sûr une des raisons pour lesquelles les gens trouvent le printemps très utile, il fournit un cadre très complet pour la gestion du cycle de vie des ressources comme les connexions jdbc et les sessions d'hibernation.

0

Si vos entités sont collectées par la mémoire, il n'y a pas de raison de surcharger la session. La session sera GCed alors ou plus tard.

Par exemple, si je stocke une référence à une session dans une liste statique, je peux courir ma demande pendant des heures, entités se perçus, mais non les sessions ...

session devrait être fermé explicitement.


Si vous n'aimez pas la fermeture explicite dans votre code, je suis totalement d'accord avec vous, et beaucoup d'autres personnes aussi. :-)

Une solution courante consiste à effectuer la fermeture dans un code de structure, c'est-à-dire du code qui est écrit une fois, et qui s'applique à toutes vos transactions. Cela peut arriver dans une superclasse, par exemple si toutes vos transactions sont implémentées via le modèle de commande. Cependant, le modèle de mise en œuvre le plus répandu de est d'utiliser AOP pour une telle préoccupation globale. Nos projets utilisent Spring, qui fournissent hors-the-box pour fermer toutes les sessions de mise en veille prolongée (et la transaction associée), avec une fonctionnalité supplémentaire pour commit/rollback:

  • si une exception est levée , rollback est appelé sur la transaction avant de le fermer
  • sinon, commit est appelé.