2010-06-12 2 views
0

Je compare les gains de performance obtenus avec l'utilisation d'un cache de second niveau dans Hibernate (activation de EhCache), mais cela ne semble pas améliorer les performances. En fait, le temps d'exécution de la requête augmente légèrement.Utilisation de EhCache pour session.createCriteria (...). List()

La requête est:

session.createCriteria(MyEntity.class).list(); 

L'entité est:

@Entity 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class MyEntity { 
    @Id 
    @GeneratedValue 
    private long id; 

    @Column(length=5000) 
    private String data; 

    //---SNIP getters and setters--- 
} 

Mon hibernate.cfg.xml est:

<!-- all the normal stuff to get it to connect & map the entities plus:--> 
<property name="hibernate.cache.region.factory_class"> 
    net.sf.ehcache.hibernate.EhCacheRegionFactory 
</property> 

Le tableau de MyEntity contient environ 2000 lignes.

Le problème est qu'avant d'ajouter dans le cache, la requête ci-dessus pour lister toutes les entités prenait en moyenne 65 ms. Après le cache, ils prennent en moyenne 74 ms. Y a-t-il quelque chose qui me manque? Y a-t-il quelque chose de supplémentaire à faire qui augmentera la performance?

Répondre

0

Par défaut, les résultats des requêtes sont et non mis en cache, seules les entités sont mises en cache. Ainsi, chaque fois que vous exécutez votre requête, SQL est toujours émis, ce qui renvoie les ID des entités correspondant à la requête. Ces entités sont ensuite extraites du cache (le cas échéant).

Si vous souhaitez que les résultats de la requête soient mis en cache, vous devez turn that on explicitly.

+0

Merci, j'ai activé le cache de requête et cela fait définitivement une différence. La requête est passée de 65 ms à 22 ms après son échauffement. –

+0

@James: La différence devrait être plus perceptible avec une requête plus complexe. – skaffman