FluentNHibernate的缓存配置?

时间:2017-06-04 21:23:11

标签: nhibernate fluent-nhibernate

我正在使用FluentNhibernate2.0.3.0,我正在尝试配置它的缓存以用于queries,我正在使用HQL。如果我完成所有配置,我想要一个意见,我想知道如何激活缓存?

连接

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));

映射

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查询

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;
    }

1 个答案:

答案 0 :(得分:1)

很可能缺少UseSecondLevelCache调用(xml配置参数cache.use_second_level_cache)。

HashtableCacheProvidernot intended for production use,仅供测试。选择another one

似乎没有使用交易。首先在事务之外完成数据更改,将禁用第二级缓存。更好地处理所有会话用法。

应配置cache.default_expiration。这是一个整数,以秒为单位。

您可以使用会话统计信息来检查是否使用了缓存。在会话工厂中启用它们。

sessionFactory.Statistics.IsStatisticsEnabled = true;

// Do your stuff then consult the statistics on the session factory.

避免让它们在生产中启用,这会产生一些开销。

附加说明:

如果您希望缓存某些映射集合,则必须在映射中为它们启用缓存。

使用延迟加载可以更好地缓存。预先加载可能会导致缓存的实体从数据库重新加载,而不是从缓存加载。