我正在使用FluentNhibernate
版2.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;
}
答案 0 :(得分:1)
很可能缺少UseSecondLevelCache
调用(xml配置参数cache.use_second_level_cache
)。
HashtableCacheProvider
为not intended for production use,仅供测试。选择another one。
似乎没有使用交易。首先在事务之外完成数据更改,将禁用第二级缓存。更好地处理所有会话用法。
应配置cache.default_expiration
。这是一个整数,以秒为单位。
您可以使用会话统计信息来检查是否使用了缓存。在会话工厂中启用它们。
sessionFactory.Statistics.IsStatisticsEnabled = true;
// Do your stuff then consult the statistics on the session factory.
避免让它们在生产中启用,这会产生一些开销。
附加说明:
如果您希望缓存某些映射集合,则必须在映射中为它们启用缓存。
使用延迟加载可以更好地缓存。预先加载可能会导致缓存的实体从数据库重新加载,而不是从缓存加载。