2011-07-28 6 views
1

J'essaie d'utiliser JBossCache en tant que fournisseur de cache de second niveau JPA/Hibernate pour mettre en cache les requêtes appelées à plusieurs reprises. Les requêtes retournent des entités d'un type spécifique, appelons-le FooType.Présentation de JBossCache - Mise en cache d'un graphique d'objets avec de nombreuses associations

FooType se présente comme suit:

@Entity(name = FooType) 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 
public class FooType { 
    protected BarType barType; 

    @ManyToOne(targetEntity = BarType.class, cascade = { 
     CascadeType.ALL 
    }) 
    BarType getBarType() { 
     return barType; 
    } 
} 

Ainsi, Footype a un grand nombre à une association. Maintenant, quand j'appelle la requête, seulement une très petite partie semble être mise dans le cache. Je pense que la raison en est que je n'ai pas marqué l'association avec le tag @Cache. Ai-je raison?

Mais la vraie question est la suivante:

Bartype a également une poignée d'associations, et ces objets de retour qui fournissent aussi des associations et ainsi de suite, la construction d'un grand graphique des associations. Maintenant, dois-je

a) annoter toutes les classes et

b) annoter aussi les associations

afin d'être mis en mémoire cache toute la requête?

Répondre

1

Toutes les entités/collections que vous souhaitez mettre en cache doivent avoir @Cache afin qu'elles puissent être mises en cache. Le cache des requêtes fonctionne légèrement différemment, pour que les résultats soient mis en cache, vous devez rendre l'objet de la requête cacheable. Btw, comme toujours, cache si cela a vraiment du sens!

http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-cache

+0

Donc, si je fais l'objet requête cacheable, je ne ai pas besoin de faire les entités Cacheable il retourne? – helpermethod

+0

Le problème est que la requête inital est mise en cache mais Hibernate crée également un géant qui déclenche des requêtes supplémentaires qui suivent la requête inital. Ceux-ci ne sont pas mis en cache. – helpermethod

+1

La requête doit pouvoir être mise en cache et les entités doivent être marquées avec @Cache. Je ne suis pas sûr de comprendre d'où proviennent ces requêtes supplémentaires. Sont-ils créés par vous? Ou en interne par Hibernate? Si elles sont internes, vous ne pouvez rien faire à ce sujet AFAIK. –

Questions connexes