2017-09-13 7 views
1

J'utilise @NamedQuery pour obtenir des résultats de mon DataBase. Après la manipulation pendant un certain temps, je compris que le @NamedQuery est demandé une fois que l'application est déployée & stocké dans le cache pour plus de performance.@NamedQuery cachable résultat alternatif

Donc, je suis à la recherche d'un moyen (type de requête) qui obtiennent toujours les informations de base de données lorsque la demande est faite, donc je peux obtenir des données toujours à jour? Et s'il y a un moyen de faire une telle chose, quelle est sa performance?

+0

une requête nommée est une fois ETABLI (en SQL). Il doit toujours être exécuté à moins que vous n'ayez activé la mise en cache RESULTATS de la requête spécifique au fournisseur JPA. Mais vous ne définissez pas ce que vous avez activé – DN1

+0

@ DN1 où puis-je trouver une telle configuration? Parce que je n'ai fait aucune configuration! –

+1

Vous avez défini un EMF, vous avez donc effectué une "certaine" configuration. Vous avez un LOG pour voir ce que SQL est appelé. – DN1

Répondre

1

Comme indiqué déjà dans les commentaires, vous avez mauvaise compréhension de la NamedQuery. Pas le résultat est stocké dans le cache, mais la requête SQL est.

Néanmoins parfois EntityManager met en cache certaines choses et je suppose que vous avez besoin d'une solution pour cela ....

Si vous travaillez avec des objets de requête (par exemple EntityManager.createNamedQuery (« nameOfYourQuery »)) et EclipseLink vous peut effectuer les opérations suivantes:

Query query = EntityManager.createNamedQuery("nameOfYourQuery"); 
query.setHint(QueryHints.REFRESH, HintValues.TRUE); 
query.getResultList(); 

Vous pouvez également des conseils requête de configuration directement dans le NamedQuery comme ceci:

@NamedQuery(name = "something", query = "SELECT n FROM something", 
[email protected](name=QueryHints.REFRESH, value=HintValues.TRUE)) 

Une autre façon wi e conseils de requête serait celui-ci:

query.setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache); 

Pour une liste des indicateurs de requête possibles, jetez un oeil à the EclipseLink docs.

Si vous souhaitez désactiver complètement la base de données résultat que vous pouvez également mettre en cache les opérations suivantes dans votre persistence.xml:

<property name="eclipselink.query-results-cache" value="false"/> 
+1

Merci ce que je cherchais, j'ai discuté de la question avec un collègue expérimenté et il me donne la même explication, mais sans les détails techniques, encore une fois merci! –