Salut à tous,
J'essaye d'optimiser mon application web de vente en ligne de séjour. Cette application fait la plus part du temps des accès en lecture seule. De temps en temps des écritures pour fermer des dates qui ne sont plus disponibles ou mettre à jour des tarifs.
Compte tenu de ce contexte, il me semble judicieux de mettre en oeuvre les mécanismes de cache de requêtes et de cache de second niveau.
J'ai fixé le cache à nonstrict-read-write et configuré hibernate pour qu'il utilise le cache de second niveau avec ehcache et le cache de requête.
Prenons l'exemple d'une requête qui retourne les 6 premiers produits qui ont une promotion la plus élevée :
Query query = session.createQuery("from Product as pdt where " +
"pdt.maximumDiscountPrice.discount = ? and " +
"pdt.maximumDiscountPrice.open = ? and " +
"pdt.maximumDiscountPrice.departureDate >= ? " +
"order by pdt.maximumDiscountPrice.discountPercentage desc");
query.setBoolean(0, true);
query.setBoolean(1, true);
query.setDate(2, DateUtil.getBegin(new Date()));
query.setMaxResults(6);
query.setCacheable(true);
query.list();
La première exécution prend 4s, les traces sql montrent que les produits son chargés de la base de données.
La deuxième et les suivantes prennent 0,5s ce qui semble étonnant étant donné qu'aucune requête n'est envoyée à la base prouvant que le cache de second niveau joue son rôle.
Si je modifie le code pour utiliser query.iterate(), la première requête se comporte de façon identique. En revanche une requête sql est envoyée pour la deuxième exécution et les suivantes : select product0_.idProduct as col_0_0_ from Product product0_, Price price1_ where product0_.idMaximumDiscountPrice=price1_.idPrice and price1_.discount=? and price1_.open=? and price1_.departureDate>=? order by price1_.discountPercentage desc limit ?
Ceci dit, le temps d'exécution ne varie guère par rapport à l'utilisation de query.list();
Je ne comprends pas pourquoi sans appel à la base de données, le temps d'exécution reste aussi élevé de l'ordre d'1/2s ?
Mon autre interrogation concerne l'utilisation de query.iterate() qui déclenche une requête sql et pas query.list().
Merci,
Ludovic Bailly
ECOTOUR.com
|