2010-10-19 16 views
1

J'ai une application web que je déploie sur Tomcat 6 et qui utilise Hibernate. Il reçoit des messages dans une file d'attente JMS qui déclenche des modifications à la fois sur ma base de données, via Hibernate et sur un objet (Agent).
Les requêtes Web accèdent également à la base de données, via Hibernate, et accèdent à l'objet partagé (il y a un ConcurrentHashMap<AgentId,Agent> détenu par un singleton).
Mon problème est que j'ai un message JMS qui change plusieurs différents Agent s et plusieurs tables et j'ai besoin que les changements dans les Agent s soient disponibles si et seulement si la transaction DB s'est terminée avec succès. De plus, je ne veux pas utiliser de verrous de lecture, car cela représente un trop grand risque pour moi.
Je pensais à en quelque sorte en mettant en œuvre l'interface XAResource pour mon singleton et ensuite utiliser JTA pour gérer mon singleton et ma transaction Hibernate.
Qu'en pensez-vous? Cela semble-t-il raisonnable? Suis-je loin?Comment envelopper un changement d'objet dans ma propre transaction et l'incorporer avec Hibernate à JTA?

Si des informations supplémentaires sont nécessaires s'il vous plaît ne pas hésiter à demander
Itthaï

Répondre

3

Au lieu de mettre en œuvre XAResource, vous pouvez utiliser un cache transactionnel comme EHCache qui prend en charge JTA depuis 2.0 (il peut agir en tant que XA ressource et participer à une transaction XA aux côtés d'autres ressources XA).

+0

voulez-vous dire que je devrais juste avoir le EHCache maintenir la carte mentionnée ci-dessus? – Ittai

+0

@Ittai Oui, exactement. –

+0

J'ai une préoccupation de performance concernant cette solution dont j'ai posté à propos (http://stackoverflow.com/questions/3967111/how-does-ehcache-implement-its-transactions). J'apprécierais que je puisse recevoir votre contribution. – Ittai