2011-02-03 5 views
1

J'essaie d'utiliser un cache de second niveau pour les entités de recherche car il y en a seulement quelques-unes et ces entités ne devraient être modifiées que dans des cas exceptionnels. Si je récupère ces entités avec ICriteria, ces entités sont placées dans le cache de second niveau, mais si je les récupère via ISQLQuery (fonction valeur-table), les entités ne sont pas mises en cache. Appeler .SetCacheable (true) etc n'a aucun effet. Par conséquent, la mise en cache de second niveau avec ISQLQuery n'est-elle pas prise en charge ou il me manque certains paramètres de configuration?Les entités retournées avec ISQLQuery ne sont pas stockées dans le cache de second niveau NHibernate?

Edit:

Exemple - première requête dans l'application IIS ensemble après le redémarrage:

var query = _session.CreateSQLQuery("SELECT {foo.*} fro dbo.foo_GetList()"); 
query.AddEntity("foo", typeof(Foo)); 
query.SetCacheable(true); 
query.List<Foo>(); 

Lorsque le code ci-dessus fonctionne, je ne vois rien ajouté dans le cache (par exemple, pas NHibernate.Caches .SysCache.SysCache - ajout de nouvelles données dans le journal NHibernate). Les appels suivants tels que _session.Get (id) effectuent une nouvelle sélection. Si je remplace ce qui suit par

var criteria = _session.CreateCriteria<Foo>(); 
criteria.List<Foo>(); 

alors les entités sont mises en cache.

En outre, il semble pour moi lors de l'utilisation ISQLQuery objets retournés ne sélectionne pas les entités dépendantes à partir du cache, mais les sélectionner à nouveau.

Répondre

3

Cela fonctionne très bien pour moi. Voici une preuve de concept:

Classe:

public class Foo 
{ 
    public virtual int Data { get; set; } 
} 

Cartographie:

<class name="Foo"> 
    <cache usage="read-write" /> 
    <id type="Guid"> 
    <generator class="guid.comb" /> 
    </id> 
    <property name="Data" /> 
</class> 

Code d'essai:

 using (var session = sessionFactory.OpenSession()) 
     using (var tx = session.BeginTransaction()) 
     { 
      session.Save(new Foo { Data = 1 }); 
      tx.Commit(); 
     } 
     using (var session = sessionFactory.OpenSession()) 
     using (var tx = session.BeginTransaction()) 
     { 
      session.CreateSQLQuery("select {foo.*} from {foo}") 
        .AddEntity("foo", typeof(Foo)) 
        .SetCacheable(true) 
        .List(); 
      tx.Commit(); 
     } 
     using (var session = sessionFactory.OpenSession()) 
     using (var tx = session.BeginTransaction()) 
     { 
      session.CreateSQLQuery("select {foo.*} from {foo}") 
        .AddEntity("foo", typeof(Foo)) 
        .SetCacheable(true) 
        .List(); 
      tx.Commit(); 
     } 

La deuxième session ne résulte en aucun DB frappe.

Assurez-vous d'avoir configuré un fournisseur de cache et activé à la fois le cache de requête et la mise en cache pour votre entité.

Questions connexes