2017-06-04 2 views
0

J'utilise FluentNhibernate version 2.0.3.0 et j'essaye de configurer le cache de celui-ci à utiliser avec queries, j'utilise HQL. Je veux une opinion si j'ai fait toutes les configurations bien, et je veux savoir comment pourrais-je voir si le cache a été activé?Configurations de cache de FluentNHibernate?

connexion

FluentConfiguration _config = Fluently.Configure() 
    .Database(
     MySQLConfiguration.Standard.ConnectionString(
      x => x.Server(HOST) 
        .Username(USER) 
        .Password(PASSWORD) 
        .Database(DB))) 
    .Cache(c => c.ProviderClass(typeof(NHibernate.Cache.HashtableCacheProvider).AssemblyQualifiedName) 
       .UseQueryCache()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UsuarioMap>()) 
    .ExposeConfiguration(cfg => new SchemaUpdate(cfg) 
    .Execute(false, true)); 

Mapping

public class UsuarioMap : ClassMap<Usuario> { 
    public UsuarioMap() { 
     Table("USUARIOS"); 
     Cache.ReadWrite(); 
     Id(u => u.id).GeneratedBy.Native(); 
     Map(u => u.nome).Not.Nullable().Length(50); 
     Map(u => u.email).Unique().Not.Nullable().Length(255); 
     Map(u => u.senha).Not.Nullable(); 
     Map(u => u.status).CustomType<int>(); 
     Map(u => u.dtCadastro).CustomType<DateTime>(); 
     Map(u => u.dtLastLogin).CustomType<DateTime>(); 
     Map(u => u.tipo).CustomType<int>(); 
     Map(u => u.imagem); 
     Map(u => u.loginBy).CustomType<int>(); 
     Map(u => u.idFacebook); 
    } 
} 

HQL Query

public class UsuarioDAO : GenericDAO<Usuario>{ 

    /** retorna todos os objetos */ 
    public IList<Usuario> findAll(){ 
     ISession _session = getSession(); 
     IList<Usuario> list = _session.CreateQuery("FROM Usuario u ORDER BY u.nome") 
      .SetCacheable(true).SetCacheMode(CacheMode.Normal) 
      .List<Usuario>(); 
     return list; 
    } 

Répondre

1

A UseSecondLevelCache l'appel est très probablement manquant (paramètre de configuration xml cache.use_second_level_cache).

HashtableCacheProvider est not intended for production use, uniquement pour le test. Choisissez another one.

Les transactions ne semblent pas utilisées. Au premier changement de données effectué en dehors d'une transaction, le cache de deuxième niveau sera désactivé. Mieux traiter toutes les utilisations de la session. Un cache.default_expiration doit être configuré. Ceci est un entier, en secondes.

Vous pouvez utiliser les statistiques de session pour vérifier si le cache est utilisé. Activez-les dans la fabrique de sessions. Évitez de les laisser activés en production, cela entraîne une surcharge.

Notes complémentaires:

Si vous avez une collection mappée vous souhaitez cache, vous devrez activer la mise en cache pour eux dans leur cartographie.

La mise en cache fonctionne mieux avec un chargement paresseux. Le chargement anticipé peut provoquer le rechargement des entités mises en cache de la base de données au lieu d'être chargé à partir du cache.