27 votes

Configurer la mise en cache des entités et des relations dans Fluent Nhibernate?

Quelqu'un a-t-il un exemple sur la façon de configurer et quelles entités mettre en cache en nhibernate fluide. À la fois en utilisant la cartographie courante et la cartographie automatique?

Et la même chose pour les relations d'entité, à la fois un-à-plusieurs et plusieurs-à-plusieurs?

31voto

Dai Bok Points 1294

J'ai travaillé une situation similaire, où je veux juste le cache des éléments spécifiques, et que vous voulez ces éléments pour être chargée qu'une seule fois au démarrage, et conservés dans la mémoire cache, jusqu'à l'arrêt de l'application. C'est une lecture que cache, et est utilisé pour remplir une liste de pays, de sorte qu'un utilisateur peut sélectionner leur pays dans la liste.

J'ai utilisé fluentNhibernate Mappages, et définie par Pays ma classe avec Cache.readonly()

public class CountryMap : ClassMap<Country> {
    public CountryMap() { 
         Schema("Dropdowns");
         Cache.ReadOnly();
         // Class mappings underneath 
    }
}

Ma classe d'utilisateur de la carte ressemble à ceci:

public class UserMap : ClassMap<User> {
    Id(x => x.Id).Column("UserId");
    Map(x => x.FirstName);
    Map(x => x.LastName);
    References(x => x.Country)
      .Column("CountryId");
}

J'ai configurer manuellement Couramment Nhibernate pour l'utilisation du cache de Second niveau. Donc, à mon couramment Confuguration j'ai:

var sessionFactory = Fluently.Configure()
    .Database (...) // set up db here
    .Mappings(...)  //set up mapping here
    .ExposeConfiguration(c => {
        // People advice not to use NHibernate.Cache.HashtableCacheProvider for production
        c.SetProperty("cache.provider_class", "NHibernate.Cache.HashtableCacheProvider");
        c.SetProperty("cache.use_second_level_cache", "true");
        c.SetProperty("cache.use_query_cache", "true");
    })
    .BuildSessionFactory();

J'ai vérifié dans le générateur de profils SQL, et quand j'ai une liste de pays pour un utilisateur, le sont chargées une fois, et je me cache après chaque demande. La bonne chose est que lors de l'affichage d'utilisateurs nom de pays, il charge à partir du cache, et ne pas faire une requête à la base de données. J'ai quelques conseils à partir de cet affichage par Gabriel Schenker. Espérons que cela aide? Si vous avez trouvé un meilleur/la bonne voie, s'il vous plaît laissez-moi savoir? Merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X