/ / Comment puis-je arrêter la mise en cache Java ou Hibernate - java, mise en veille prolongée, mise en cache

Comment puis-je arrêter la mise en cache Java ou Hibernate - java, mise en veille prolongée, mise en cache

J'ai une application pour récupérer des données de la base de données et je surveille le temps nécessaire à mon application pour récupérer des données.

Mais j'ai un problème lorsque j'utilise le même jeu de données pour récupérer des données avec mon application. La seconde récupération prendra beaucoup moins de temps.

Je suppose que Java ou Hibernate a un cache ou tempfichier pour sauvegarder les données, donc la deuxième exécution sera rapide, mais je ne veux pas que cela se produise. J'ai besoin de surveiller le temps qu’il prend réellement, pas le temps de récupération du cache ou du fichier temporaire.

J'ai essayé d'interdire le cache et le fichier temporairegénérer dans le panneau de configuration Java, j'ai essayé de désactiver le cache de veille prolongée (premier niveau ou deuxième niveau). Mais ce ne sont toujours pas résoudre mon problème. La deuxième fois prend encore moins de temps que prévu.

Avez-vous une idée de la raison qui a poussé la deuxième fois à courir plus vite? il suffit d'une application simple pour récupérer des données à partir de DB

Réponses:

5 pour la réponse № 1

Le cache de premier niveau d'Hibernate ne peut pas être désactivé (voir Comment désactiver la mise en cache en veille prolongée). Vous devez comprendre le cache de session d’Hibernate si vous voulez Obliger Hibernate interroge la base de données.

Lokesh Gupta a un bon tutoriel sur http://howtodoinjava.com/2013/07/01/understanding-hibernate-first-level-cache-with-example/

  1. Le cache de premier niveau est associé à l’objet «session» et à d’autres les objets de session dans l'application ne peuvent pas le voir.
  2. La portée des objets de cache est de session. Une fois la session fermée, les objets en cache sont partis pour toujours.
  3. Le cache de premier niveau est activé par défaut et vous ne pouvez pas le désactiver.
  4. Lorsque nous interrogeons une entité pour la première fois, elle est extraite de la base de données. et stockés dans le cache de premier niveau associé à une session de veille prolongée.
  5. Si nous interroger à nouveau le même objet avec le même objet de session, ce sera chargé à partir du cache et aucune requête SQL ne sera exécutée.
  6. L'entité chargée peut être retirée de la session à l'aide de la méthode evict (). Le prochain chargement de cette entité fera à nouveau appel à la base de données si il a été supprimé à l'aide de la méthode evict ().
  7. L'ensemble du cache de session peut être supprimé à l'aide de la méthode clear (). Ce sera supprimer toutes les entités stockées dans le cache.

Vous devriez donc utiliser soit le evict() ou clear() méthode pour forcer une requête à la base de données.

Afin de vérifier cela, vous pouvez activer la sortie SQL en utilisant le hibernate.show_sql propriété de configuration (voir https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html#configuration-optional).


1 pour la réponse № 2

Avez-vous essayé de désactiver le cache dans la base de données elle-même?

Je pense que les caches de premier et deuxième niveau d'Hibernate sont spécifiques à Hibernate, mais la base de données restera toujours sous cache

MySQL - force à ne pas utiliser le cache pour tester la vitesse de la requête