2017-02-13 4 views
0

Les indicateurs de requête ne fonctionnent pas dans Eclipse Link 2.3.2/2.6.1 lorsqu'ils sont utilisés pour extraire des données de seconde Cache niveau Conseils d'occasion,javax.persistence.cache.retrieveMode et javax.persistence.cache.retrieveMode ne fonctionne pas avec NamedQuery lorsqu'il est utilisé avec Eclipse Link ORM

@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") 

essayé avec des options ci-dessous.

1. Added JPA Hints to Named query itself 
@NamedQuery(
name = TestEntity.FIND_BY_CODE, 
query = "select t from Test t where t.code = :code", 
hints = { 
@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") }) 

2. Adding hints to the Entity Manager Itself after injecting it 
em.setProperty("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE); 
em.setProperty("javax.persistence.cache.storeMode", CacheRetrieveMode.USE); 

3. Added JPA hints at the time of Query execution 
em.createNamedQuery(TestEntity.FIND_BY_CODE, 
AlertCategoryType.class).setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE) 
.setHint("javax.persistence.cache.storeMode", CacheStoreMode.USE) 
.setParameter("code", code).getSingleResult(); 

Aucune des indications ci-dessus n'a fonctionné. Ensuite, j'ai essayé de déboguer sur trois options différentes ce que j'ai trouvé, la requête de base de données qui s'est formée après la définition de ces conseils passe des indicateurs comme paire clé/valeur ci-dessous. Où eclipselink.query.hints est la clé, même lorsque nous avons défini les indicateurs JPA. C'est quelque chose que nous n'avons pas le contrôle pour changer cela.
Mais lorsque je transmets les indications fournies par Eclipse Link comme ci-dessous, il a commencé à fonctionner comme prévu et les résultats sont extraits du cache et non de la base de données.

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 

Cela signifie que lorsque nous utilisons Eclipse lien, il ne reconnaît que Eclipse lien fourni des conseils en fonction de la touche [ci-dessus montré] que nous voyons dans la requête.

S'il vous plaît suggérer un travail autour pour obtenir le travail Conseils JPA

Environnement J'utilise est

  • Eclispe Lien 2.3.2/2.6.1
  • fin Runnin servir Glassfish 4.1 [payara ]
  • Java8/JEE7

Répondre

1

L'indice de requête que vous énoncez travaille (eclipselink.query-cache les résultats) est complètement indépendant - il crée un nouveau cache pour les résultats de la requête afin que la prochaine fois que vous exécutez la même requête, les résultats sont déjà là, il n'a donc pas besoin d'exécuter à nouveau la requête. C'est à l'extérieur (au-dessus d'un au-delà) le cache de second niveau.

Les paramètres que vous appelez ne pas fonctionner affectent le cache de second niveau. Sans plus d'informations, je vais dire qu'ils travaillent probablement comme prévu. Tout simplement parce que votre requête va à la base de données ne signifie pas que le cache n'est pas utilisé. La mise en cache des entités est très différente de la mise en cache des résultats dans une requête. Si les résultats de la requête ne sont pas mis en cache, à moins que vous n'ayez activé l'interrogation en mémoire, la plupart des requêtes de type lecture-totalité doivent être envoyées à la base de données pour déterminer les entités à construire et à renvoyer. EclipseLink utilisera ensuite ces résultats pour vérifier le cache: si les entités existent déjà, elles sont renvoyées telles quelles, ce qui évite le surcoût de la reconstruction des entités à partir des données.

Vous pouvez vérifier si votre entité a été mise en cache en utilisant une requête em.find() ou une requête en lecture qui utilise la valeur d'ID. Le cache est indexé par ID, il n'a donc pas besoin d'aller à la base de données pour déterminer quelles entités vous voulez.