2011-12-03 5 views
4

Dans mon application, lorsque l'utilisateur se connecte au système, le système lit certains paramètres de la base de données et les stocke sur la session de l'utilisateur. Le système exécute cette action via une requête JPA à l'aide d'EclipseLink (JPA 2.0).Désactivation du cache EclipseLink

Lorsque je modifie certains paramètres dans la base de données et que je me reconnecte, la requête renvoie les résultats précédents. Il semble qu'EclipseLink met en cache les résultats.

J'ai utilisé cela pour corriger ce problème, mais cela ne fonctionne pas:

query.setHint(QueryHints.cache_usage,cacheUsage.no_cache); 

Répondre

6

Si vous souhaitez définir les indicateurs de requête, le docs recommande de faire:

query.setHint("javax.persistence.cache.storeMode", "REFRESH"); 

Vous pouvez alternativement définir @Cacheable annotation de l'entité affectée

@Cacheable(false) 
public class EntityThatMustNotBeCached { 
... 
} 
3

Si vous retournez un certain type d'entité de configuration et que vous voulez être sûr que les données ne sont pas périmées, vous peut invoquer em.refresh(yourEntity) après avoir renvoyé l'entité de la requête. Cela forcera le fournisseur JPA à obtenir de nouvelles données de la base de données malgré la mise en cache.

Si vous souhaitez désactiver le cache L2 que vous pouvez utiliser dans les <shared-cache-mode>NONE</shared-cache-mode><persistence-unit> dans persistence.xml ou utiliser Cacheable(false) directement sur votre entité de configuration.

Si vous renvoyez des champs au lieu d'entités et que vous obtenez toujours des données périmées, vous pouvez essayer d'effacer le PersistenceContext en appelant em.clear().

Questions connexes