2008-12-18 8 views
5

J'ai 2 applications Web différentes (paquet dans différents fichiers de guerre) qui ont besoin de partager des données via un cache (ehcache). Je veux tester cette idée avec vous pour voir si cela fonctionne.Accéder à la même ehcache à partir de 2 fichiers de guerre différents

Mon idée est de créer un service qui amorce/accède à l'ehcache et au paquetage à l'intérieur d'un pot. Ensuite, emballez ce pot dans les deux guerres:

  • WAR1: ehcache-service.jar
  • WAR2: ehcache-service.jar

Would ehcache travail dans une telle configuration?

+0

pourriez-vous élaborer plus sur ce que vous essayez d'accomplir avec le cache partagé? – lucas

+0

Je veux l'utiliser comme un verrou distribué. Je pourrais utiliser une base de données pour indiquer qu'une transaction est en cours (mais je crois que c'est un anti-pattern). Usecase: War1 démarre un tx, le stocke dans le cache. Cela empêche le démarrage du même tx. War2 invalide tx en fonction d'un événement externe. – ashitaka

Répondre

5

Vous devez créer un ou plusieurs jar (s) séparé (s) avec toutes les classes (et toutes leurs dépendances) dont vous prévoyez de mettre en cache puis déployer ce fichier jar ainsi que ehcache.jar en tant que bibliothèque (en fonction du serveur d'application utilisez la procédure peut être différente), dans le cas de Tomcat 6 cela signifie simplement copier des fichiers jars dans le dossier lib. Ce qui se passe alors, c'est qu'ehcache et vos classes de domaine seront chargées par le chargeur de classes partagé par toutes les applications Web, les instances seront donc mises en cache et accessibles en mémoire. Les dépendances de vos classes de domaine sont importantes. Vous devriez donc voir si cette approche est réalisable dans votre projet. Cela peut également affecter la façon dont vous redémarrez les applications Web. En outre, vous devez savoir que le cache et le partage ne sont pas nécessairement la même chose. Le cache est une optimisation. Si vous mettez une instance d'objet dans le cache, elle peut être expulsée immédiatement si, par exemple, le cache n'a pas assez d'espace de stockage ou de configuration de politique d'expulsion. Donc peut-être vous devez revoir la façon dont vous prévoyez d'utiliser ecache en général.

+0

J'utilise Tomcat de sorte que les bibliothèques partagées par toutes les applications web vont dans CATALINA_HOME/common/lib. Il y a un problème plus compliqué car je veux répliquer le cache sur plusieurs serveurs Tomcat dans un cluster. – ashitaka

+0

J'aime votre déclaration "Cache est une optimisation". Je devrais peut-être revenir à l'utilisation de la base de données pour stocker l'état partagé car je peux utiliser le niveau d'isolation SERIALIZABLE pour assurer des lectures/écritures cohérentes. – ashitaka

2

Le problème de votre configuration est que chaque guerre sera chargée avec un ClassLoader séparé et qu'il y aura deux instances de votre service ehcache - chaque application web a sa propre copie de service. Vous pouvez implémenter votre service de mise en cache en tant que service Web (par exemple) et l'utiliser depuis war1 et war2.

Questions connexes