La gestion de Session de l'utilisation d'Hibernate dans une application Swing
Comment faites-vous votre session Hibernate gestion en Java Desktop application Swing? Utilisez-vous une seule session? Plusieurs sessions?
Voici quelques références sur le sujet:
- http://www.hibernate.org/333.html
- http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/
- http://in.relation.to/Bloggers/HibernateAndSwingDemoApp
OriginalL'auteur Dema | 2008-11-06
Vous devez vous connecter pour publier un commentaire.
Seule session. Début de la transaction lorsque vous devez effectuer un ensemble d'opérations (mise à jour des données après la boîte de dialogue bouton OK), validation de l'tx à la fin. La connexion est bien en permanence ouvert (puisque c'est la même session), et donc toutes les possibilités pour la mise en cache peut être utilisé par les deux vaccins contre le Hib et SGBDR.
Il peut aussi être une bonne idée de mettre en place un processus transparent séance de ré-ouvert dans le cas où la connexion a coupé -- les utilisateurs ont tendance à laisser les applications s'ouvrent pendant de longues périodes de temps, et il devrait continuer à travailler lundi, même si la DB du serveur a été redémarré le week-end.
Mise à jour
Jens Schauder fourni une raison d'utiliser plusieurs sessions: partielle (non désirée) des mises à jour pour la session. Eh bien, c'est la façon dont vous utilisez la mise en veille prolongée.
Supposons que nous avons deux boîtes de dialogue ouvrir (comme dans Jens' blog exemple). Si l'utilisateur clique sur un radiobox, et nous avons immédiatement mise à jour Hibernate entité associée à cette radiobox, puis, lorsque l'utilisateur clique sur Annuler, nous sommes en difficulté-session est déjà mis à jour.
De la bonne façon, comme je le vois, est de dialogue de mise à jour des variables (non-Hibernate objets). Ensuite, lorsque l'utilisateur clique sur OK, on commence une transaction, de fusionner les objets mis à jour, valider la transaction. Aucun déchet n'obtient jamais enregistré dans la session.
Si nous mettons en œuvre une telle séparation des préoccupations, plus tard, nous pouvons passer à plusieurs séances avec un simple changement de MyHibernateUtils.begin() de la mise en œuvre.
Que la possibilité d'une fuite de mémoire, eh bien... de la Transaction.commit() appelle la Session.flush(), qui, autant que je sache, nettoie le cache de trop. Aussi, on peut contrôler manuellement la politique de mise en cache par l'appel de Session.setCacheMode().
OriginalL'auteur Vladimir Dyuzhev
Problème avec "session"par sujet"" est bon Swing applications ne les accès de base de données à l'extérieur de l'EDT, généralement dans l'un des nouveaux SwingWorker threads. De cette façon, "session"par sujet"" devient rapidement "session"par clic"".
OriginalL'auteur
Ne pas utiliser une seule session. Pour tout, mais le plus petit des applications, il grandira, la collecte de données obsolètes et devenir plus lent et plus lent, car le sale case doit vérifier chaque entité dans la session.
Si vous n'avez pas besoin/envie d'un chargement différé et du suivi des modifications apportées par la mise en veille prolongée, vous pouvez utiliser de courte durée des séances.
Mais si vous voulez bénéficier de la puissance de Hibernate utiliser l'approche que j'ai décrit dans mon blog:
http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/
ou dans la version allemande:
http://blog.schauderhaft.de/2007/12/17/hibernate-sessions-in-fat-client-anwendungen/
Autant que je sache, c'est vraiment la même approche décrite dans le http://in.relation.to/Bloggers/HibernateAndSwingDemoApp mais avec une recommandation la façon de portée de votre session:
Sur la Session par Image, à l'exception de modal des Cadres où l'utilisation de la session de l'Image parent.
Assurez-vous juste de ne jamais combiner les objets de différentes sessions. Il sera la cause de beaucoup de mal.
En réponse à mr vladimirs mise à jour:
Comment un délai d'attente de connexion seront-ils traités? Exemple: l'utilisateur ouvre un éditeur et où une entité ne peut être modifié. L'éditeur n'est pas fermé ou l'entité est enregistrée (l'utilisateur quitte l'éditeur est ouvert et va à son week-end). Maintenant, le délai d'attente de connexion apparaissent... comment gérer cela avec l'API JPA? Réouverture de l'EntityManager et de fusion de l'entité?
OriginalL'auteur Jens Schauder
Utiliser une session par thread (doc) et une version ou à une colonne timestamp pour permettre l'accès concurrentiel optimiste et d'éviter ainsi de session à l'exemple des conflits. Joindre les instances de session lorsque nécessaire, sauf si vous avez besoin de longues transactions en cours d'exécution ou restrictif du niveau d'isolation.
OriginalL'auteur stili