Hibernate Pagination à l'aide de requêtes HQL

Hibernate Pagination Question

J'ai un problème qui est lié à l'Hibernation de la Pagination et pour une certaine mesure, cela a été expliqué dans

Mysql Optimisation De La Pagination

L'utilisation d'Hibernate est ScrollableResults à lire lentement de 90 millions de disques

Hibernate - HQL la pagination

Des problèmes avec la Pagination et le Tri

Hibernate Ligne De Pagination

Détails

Requête HQL de l'Application:

Query q = session.createQuery("from RequestDao r order by r.id desc");
            q.setFirstResult(0);
            q.setMaxResults(50);

Requête renvoie 3 millions de documents et pour la pagination nous en sommes à seulement 50 de ces enregistrements, la pagination de la page est très lent, car à chaque actualisation, nous appelons la requête qui bénéficient de 3 millions de dossiers et de ceux que nous avons seulement mis 50 enregistrements.

Ma principale question est

Ne HQL va toujours et les coups de base de données ou faut-il aller frapper la session ou de la mémoire pour chercher les données et si ça se passe à chaque fois à frapper la base de données et obtenir jeu de résultats, alors il est très bon du point de vue des performances, ce qui serait la meilleure des solutions pour l'améliorer?

À l'aide de requêtes HQL en veille prolongée est-il un moyen que nous pouvons requête de base de données et obtenir seulement 50 enregistrements d'abord et ensuite obtenir d'autres documents requis par l'utilisateur. Ce défi est vraiment entraînant vers le bas de l'application, de sorte que ce serait la meilleure façon de résoudre ce problème?

Requête HQL générés dans les journaux

from com.delta.dao.RequestDao r order by r.id desc

Hibernate Requête Générée

select
    getrequest0_.ID as ID24_,
    getrequest0_.TIME as START3_24_,
    getrequest0_.STAT as STATUS24_,
    getrequest0_.SUM as SUMMARY24_,
    getrequest0_.OUTNAME as OUTPUT7_24_,
    getrequest0_.INPNAME as INPUT8_24_,
    getrequest0_.REQUEST_DATE as requestT9_24_,
    getrequest0_.PARENT_ID as PARENT10_24_,
    getrequest0_.INTER_TYPE as INTERPO60_24_,
    getrequest0_.OPEN_INT as OPEN61_24_,
    getrequest0_.SOURCE_TYPE as SOURCE62_24_,
    getrequest0_.TARGET_TYPE as TARGET20_24_,
    getrequest0_.SOURCE as SOURCE14_24_,
    getrequest0_.COPY_DATA as COPY16_24_,
    getrequest0_.CURVE as GENERATE63_24_,
    getrequest0_.TITLE as TITLE24_,
    getrequest0_.TIME_ID as TIMESERIES12_24_,
    getrequest0_.TASK_NAME as TASK51_24_ 
from
    REQUEST getrequest0_ 
where
    getrequest0_.KIND='csv' 
order by
    getrequest0_.ID desc

Ici est la Expliquer le Plan de pour la requête:


 | id | select_type | table | type | possible_keys | clé | key_len | ref | lignes | filtrée | Extra | 
| 1 | SIMPLE | getrequest0_ | ref | TR_KIND_ID | TR_KIND_ID | 6 | const| 1703018 | 100.00 | à l'Aide de lequel | 

Informations supplémentaires: l'exécution de la Requête avec et sans clause order by sur 50 limite d'enregistrements


Si je exécuter la requête with order clause de requête prend 0.0012 s avec réglage LIMIT 50 et without order clause, même requête prend 0.0032 s avec le même LIMIT 50.


Également comment pouvons-nous trouver si:

  1. Particulier Requête HQL est de frapper la base de données et pas de cache ou d'obtenir des informations de session?
  2. Est-il vrai que la Requête HQL toujours frappé base de données pour obtenir le résultat et les Critères aller frapper la session ou de cache et d'obtenir des résultats?
  3. Aussi dans mon mentionnées ci-dessous requête:
    a) Query q = session.createQuery("from RequestDao r order by r.id desc");
    b) q.setFirstResult(0);
    c) q.setMaxResults(50);

à un, est-il vrai que nous obtenons le résultat à partir de la base de données et de les stocker dans la mémoire ou si pas et en ce moment nous avons 3 millions de résultats dans le jeu de résultats, puis en b et c et nous avons fixé la valeur de décalage et limite donc sur la page, on peut seulement voir 50 résultats jusqu'à maintenant, où sont les 3 autres millions de disques et sur notre deuxième appel à cette requête, nous ne serons pas aller frapper base de données et d'obtenir 3 millions d'enregistrements et de les mettre en mémoire, puis à c de nouveau nous avons mis 50 enregistrements et aller sur une sur.

Cette question n'est pas claire pour moi, et qui seraient donc très reconnaissant si quelqu'un peut fournir d'explication claire et détaillée que la façon dont cela fonctionne, et ce qui serait la meilleure solution pour ce problème.

Mise à jour

Comme il s'avère, la question éprouve n'est pas lié à l'affichage des dossiers sur la page mais j'ai un filtre sur cette page et sur chaque requête ai toutes déroulant valeurs à nouveau à partir de la base de données et il y a certaines choses funky se passe là-bas qui est à l'origine de montée temps de chargement de page.

Je suis en train de multiples imbriquées hibernate requêtes de base de données et l'obtention de résultats, ce qui serait une solution optimale pour ce problème?

cette question est ouverte que j'ai encore pas eu de réponse à mes questions, faire ajouter des réponses, si vous avez des informations.
J'ai juste édité ma réponse afin de refléter la mise à jour.

OriginalL'auteur Rachel | 2012-01-25