quels sont certains des problèmes communs avec Hibernate/persistance?
J'ai une application que je voudrais tester-preuve contre d'éventuels problèmes liés à la mise en veille prolongée et/ou la persistance.
Quels sont les autres problèmes? Comment puis-je reproduire (littéralement)? Et comment voulez-vous récupérer?
De préciser: je parle de multi-thread environnement de cluster (le plus complexe).
Mon seul:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
Reproduire:
- Charge de l'objet.
- Mise à JOUR à l'aide de requêtes HQL.
- Essayer de mettre à jour (enregistrer) de l'objet chargé.
Poignée: Pas sûr...
OriginalL'auteur Poni | 2012-07-02
Vous devez vous connecter pour publier un commentaire.
Lazy loading est l'un des gros problèmes que vous pourrez rencontrer, surtout si vous suivez une norme de DAO modèle. Vous vous retrouverez avec un paresseux chargé des collections, mais au moment de sortir de votre couche DAO, de printemps (ou d'autre chose si vous n'êtes pas à l'aide de printemps) risque de fermer la session.
Dans ce cas, lors de l'appel pour "sauver" complète, le printemps sera la fermeture de votre session si vous n'êtes pas dans une autre transaction. En conséquence, tous les appels à paresseusement objets chargés va jeter un LazyInitializationException.
Typique de la façon de gérer cela est de se lier à une session pour le thread courant. Dans webapps, vous pouvez le faire facilement avec le OpenSessionInViewFilter. Pour la ligne de commande, vous aurez probablement besoin d'écrire une méthode utilitaire qui crée une session, se lie à la thread en cours, puis se délie lorsque vous avez terminé. Vous pouvez trouver des exemples de ce sur tout le web.
Et sur l'objet de collections, si vous utilisez la méthode update (encore quelque chose que vous devez généralement faire avec un standard de DAO dessin), vous devez être prudent de ne pas remplacer collection de cas, mais plutôt que vous devez manipuler la collection qui est déjà en place. Sinon, hibernate va avoir un moment difficile de déterminer ce qui doit être ajouté/supprimé/jour.
OriginalL'auteur Matt
Le problème que vous avez observé est l'une des modifications simultanées de données. Hibernate a beaucoup de solutions sont possibles pour traiter cette question.
Essentiellement, le problème est que deux threads (ou deux machines en cluster) agissent sur les mêmes données en même temps. Considérons cet exemple:
Ce qui va se passer lors de la deuxième machine tente de commettre ses changements? Hibernate va voir que les données ont changé, tandis que la machine 2 a été de travailler sur les données. C'est, d'une machine 2 de la mise à jour est sur des données périmées. Hibernate ne peut pas toujours fusionner les deux modifications (mais ce n'est pas toujours le comportement souhaité), de sorte qu'il rejette la deuxième mise à jour en lançant
org.hibernate.StaleObjectStateException
Comme je l'ai mentionné ci-dessus, Hibernate vous donne de nombreuses options pour résoudre ce problème. Le plus simple, peut-être, est d'ajouter un champ version à l'aide de
@Version
sur vos objets de données. Hibernate maintiendra automatiquement la "version" des données. Chaque fois qu'une mise à jour, la version sera modifiée automatiquement en veille prolongée. Votre travail est de vérifier que la version n'a pas changé entre le moment où vous lire les données et quand vous mise à jour les données. Si elles ne correspondent pas, vous pouvez faire quelque chose pour traiter le problème (c'est à dire indiquer à l'utilisateur). Il y a quelques techniques plus sophistiquées pour la prévention des mises à jour simultanées, mais c'est le plus simple.Pourriez-vous citer un ou deux "techniques de pointe pour la prévention des mises à jour simultanées" s'il vous plaît? Je suis vraiment intéressé.
Assurez-vous. Le lien que j'ai posées ci-dessus parle de trois techniques: l'Application de contrôle de version (que vous êtes en train de faire), séance Prolongée et automatique des versions, des objets Détachés et automatique des versions. En plus de cela, vous pouvez utiliser le verrouillage Pessimiste, ce qui vous donne plus de contrôle explicite sur vos données.
OriginalL'auteur Oleksi
Aller chercher trop de données est probablement le plus grand problème que vous pouvez avoir lorsque vous utilisez un outil ORM, car il est très facile de charger façon plus de données que nécessaire. Ce problème n'est pas la réplique de dev/test de scénarios, si la quantité de données de test est plutôt petit, et une fois que les données commencent à s'accumuler dans la production, la couche d'accès aux données peut obtenir de façon exponentielle plus lent.
Il ya beaucoup de problèmes qui peuvent se produire, comme expliqué dans la Haute Performance De Persistance Java livre:
OriginalL'auteur Vlad Mihalcea