Quand utiliser EntityManager.clear()?

Une classe de mappeur JPA personnalisée a une méthode:

removeUser()

1. execute 'DELETE' HQL query to remove user
2. call getEntityManager().flush();
3. call getEntityManager().clear();

Si je comprends bien clear (), il supprimera du contexte toutes les entités persistantes. -source

Cependant, j'ai aussi lu ici,

you should define clear architecture- and design guidelines about where a 
clear() can be called. 

Quelles sont les directives claires sur le moment d'appeler clear()?

23
demandé sur Kevin Meredith 2012-12-15 01:36:49

2 réponses

Les articles l'expliquent. L'effacement du gestionnaire d'entités vide son cache associé, forçant les nouvelles requêtes de base de données à être exécutées plus tard dans la transaction. Il n'est presque jamais nécessaire d'effacer le gestionnaire d'entité lors de l'utilisation d'un gestionnaire d'entité lié à une transaction. Je vois deux raisons d'effacer:

  • lors du traitement par lots, afin d'éviter d'avoir un cache géant mangeant de la mémoire et d'augmenter le temps de rinçage en raison de longs contrôles Sales
  • lorsque vous faites DML ou SQL requêtes, qui contournent complètement le cache entity manager (comme dans votre exemple). Dans ce cas, l'état détenu par le cache ne reflète pas ce qui est dans la base de données en raison des requêtes, vous voulez donc effacer le cache pour éviter cette incohérence.
26
répondu JB Nizet 2014-09-01 05:52:01

Oui, cela dépend exactement du style d'architecture de la plate-forme en tant que points de documentation.

  • par exemple, si dans votre application EM est associé à un thread, alors l'un des les solutions pour la gestion des transactions consiste à implémenter un modèle de Session par requête qui démarre une transaction à chaque début de la demande de l'utilisateur et à valider et effacer le cache à chaque extrémité de la requête afin d'éviter les lectures sales. Ceci est juste un exemple simple
  • autre exemple est dans un SOA plate. Pour chaque service pourrait également ouvrir une transaction au début et la valider à la fin avec compensation (dans le cas où le même EM est utilisé par un autre service et éviter les lectures Sales est nécessaire)
  • je vais rejouer les deux cas courants précédents - traitement par lots un et en contournant dans tous les cas possibles le EM. Donc, dans ce cas, les requêtes seront forcées d'interroger à partir de la base de données , pas à partir du cache.
  • vous devez savoir que vous travaillez avec les caches L1 et L2 et que L1 est le cache effacé par EM. Lorsque vous lisez un énorme ensemble de données (ce ne devrait pas être le cas)( la compensation est également requise dans une période.

Comme vous le voyez dépend des cas, de l'architecture et du style de votre plate-forme. Directement pour votre méthode - ce n'est pas une bonne pratique de vider et d'effacer le cache par méthode, c'est une méthode anti pattern.

5
répondu Simeon Angelov 2012-12-15 09:49:24