2013-02-17 8 views
2

Après la mise à niveau d'Hibernate 3 vers Hibernate 4, je suis obligé de retirer HibernateTemplate de mon application basée sur le printemps. Pour qu'une session Hibernate soit disponible, je dois utiliser une démarcation de transaction plus cohérente qu'avant. Cela m'oblige à ajouter un conseil de transaction à ma couche de service ainsi qu'à porter une attention particulière aux threads d'arrière-plan effectuant des opérations de base de données en lecture seule. J'ai deux sources de données (je dois utiliser deux bases de données différentes), la première étant utilisée pour presque toutes les demandes d'application, la seconde uniquement pour les demandes spéciales (disons 1 sur 1000). Le plus simple est d'utiliser des aspects pour envelopper les deux types de demandes dans les transactions pour les deux bases de données (je n'ai pas besoin de déterminer quelles requêtes nécessitent quelles bases de données), mais je m'interroge sur les frais généraux impliqués. Est-ce que l'acquisition de la connexion à la base de données réelle et la logique de transaction (comme la validation, etc.) sont reportées jusqu'à ce que les requêtes soient effectuées? Ou est-ce que mon approche aboutit à un grand nombre de transactions (inutilisées) en cours de démarrage et d'engagement?Redémarrage de la transaction Hibernate de printemps

Pour clarifier, j'ai deux sources de données, deux gestionnaires de transactions, deux conseils de transaction pour deux coupures de points "inServiceLayer" (identiques).

Merci pour toute aide!

Répondre

1

Que voulez-vous dire exactement par "utiliser les aspects pour envelopper les deux types de demandes dans les transactions"? Vos questions suggèrent que votre application n'est pas correctement calque. Vous devriez avoir une sorte de couche d'accès aux données, où la logique transactionnelle est appliquée de manière déclarative (@Transactional) ou par programmation (TransactionTemplate). Ce qui signifierait que les demandes qui n'atteignent pas la base de données n'ouvriront jamais une transaction.

Edit:
En cas superposition correcte est pas une option, vous encourrez certainement les frais généraux de gestion des transactions. Les outils standards pour la démarcation des transactions à Spring n'implémentent pas ce type d'initialisation de transaction "paresseux/à la demande" que vous recherchez. Le moyen le plus simple de le prouver est d'activer la journalisation du niveau de débogage/trace sur le gestionnaire de transactions que vous utilisez.

+0

Merci pour votre réponse. Vous avez raison: l'application n'est pas idéalement superposée. Certaines classes accèdent à la première base de données, les classes accèdent à la deuxième base de données et les classes accèdent aux deux bases de données. Si j'avais trois couches séparant ces classes, je pourrais correctement appliquer la séparation des transactions. Mais comme c'est le cas aujourd'hui, je ne peux pas facilement distinguer ces classes, j'ai donc choisi d'ouvrir une transaction dans les deux bases de données dans tous les cas. –

1

Je ne considère pas les frais généraux en premier lieu, le plus gros problème que je peux voir ici est que votre approche est fondamentalement erronée. Supposons qu'une certaine logique ait accès à DB-1 et DB-2, et après que vous ayez validé DB-1, et que vous essayez de valider DB-2, il y a un problème et txn à DB-2 doit être lancé En arrière, vous aurez des données incohérentes dans DB-1 et DB-2, car la transaction dans DB-1 a déjà été validée. Votre cas devrait être mieux en utilisant la transaction distribuée (je souhaite que votre DB supporte XA), donc vous avez seulement 1 transaction (distribuée) à gérer dans votre coupure de printemps. Et, je crois (bien que je ne sois pas sûr à ce sujet) transaction XA normale ne va pas créer aveuglément la transaction sous-jacente dans toutes les ressources (c.-à-txn sous-jacent est créé seulement si nécessaire). Ainsi, l'utilisation de txn distribuée vous offre une implémentation plus correcte, concrète, maintenable et (probablement) moins gourmande en ressources.

Étudiez plus loin sur votre conteneur sur les configurations connexes.

+0

Adrian, merci beaucoup pour votre réponse. Heureusement, DB-2 est en lecture seule et DB-1 a toutes les données de production.Néanmoins, les transactions distribuées semblent être la bonne idée. –

+0

Je ne sais pas quelle réponse je devrais marquer comme la bonne - les deux réponses m'a aidé, merci! :-) –

Questions connexes