2010-08-09 8 views
3

Je travaille actuellement sur un projet qui utilise JPA (Toplink, actuellement) pour sa persistance. Actuellement, nous utilisons un seul serveur d'application, mais pour la redondance, nous aimerions ajouter un équilibreur de charge et un autre serveur d'application (et peut-être même plus au fur et à mesure de sa croissance).JPA avec plusieurs serveurs

D'abord, je suis confronté au problème de la mise en cache JPA. Étant donné que deux processus mettent à jour la même base de données, le cache JPA renvoie la valeur mise en cache plutôt que d'aller à la base de données. Je vois comment désactiver cela, et la base de données elle-même implémente un niveau de mise en cache. Est-ce que éteindre la cache complètement la façon d'aller ici? Je vois les moyens de dire à JPA de toujours obtenir de la base de données au niveau de la requête, mais dans un environnement multi-serveur, il semble que vous voudrez toujours que cela se produise. En plus de cette question spécifique, je suis intéressé par tous ceux qui ont implémenté une solution JPA avec plusieurs serveurs d'applications et les problèmes qui se sont posés pendant l'implémentation (et toutes les suggestions que vous avez).

Merci beaucoup.

+0

À quoi faites-vous référence? Quelque chose de TopLink (JPA 1.0 n'a pas normalisé le cache L2)? Pouvez-vous clarifier? –

+0

Je parle ici de la mise en cache de session (http://weblogs.java.net/blog/guruwons/archive/2006/09/understanding_t.html). – MikeTheReader

+0

Pourquoi n'avez-vous pas fourni ce lien lorsque vous postez votre question? L'ajout de contexte ou de liens ne fait généralement pas de mal, en particulier lorsqu'une question concerne une fonctionnalité spécifique d'un fournisseur et non une APP. –

Répondre

6

Comme vous l'avez trouvé, vous pouvez désactiver le cache partagé, voir http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching ou http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

Il y a aussi d'autres options disponibles dans EclipseLink en fonction de vos données et exigences.

Une liste d'options comprend:

  1. Désactiver le cache partagé

  2. Activer la coordination du cache (voir, http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/config/PersistenceUnitProperties.html#COORDINATION_PROTOCOL)

  3. Définissez un délai d'invalidation de cache (voir, http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/annotations/Cache.html#expiry%28%29)

  4. Activer le verrouillage optimiste, cela garantira que tout stal L'objet ne peut pas être mis à jour, lorsqu'une mise à jour sur des données périmées se produit, il échouera et EclipseLink invalidera automatiquement l'objet dans le cache.

  5. Étudiez l'intégration Oracle TopLink d'EclipseLink et d'Oracle Coherence pour fournir un cache distribué.

Voir aussi, http://en.wikibooks.org/wiki/Java_Persistence/Caching#Caching_in_a_Cluster

Il n'y a pas de solution parfaite, la solution utilisée normalement dépendent des données/classe, normalement une application a un ensemble de lecture seule des classes, principalement en lecture des classes et écrire surtout des cours. Personnellement, je voudrais activer le cache pour la lecture seule avec un délai d'attente de 1 jour, activer le cache avec la coordination du cache pour la lecture en grande partie, et désactiver le cache pour l'écriture la plupart du temps.