NHibernate的第三级缓存

10
我们的项目使用Entity Framework,并且有两种类型的缓存(内存和Redis),没有任何缓存提供程序。由于EF中不支持二级缓存, 我们自己实现了它。因此,我们的内存缓存是一个简单的键值对集合,其中键是缓存的Id,值是缓存的对象。我们还实现了类似的Redis缓存。对于查询,我们查看内存缓存列表,如果不存在,则查看redis,如果仍然不存在,则对数据库进行查询。
由于Entity Framework实体引用上下文,所以我们不能在缓存中使用DbContext的实体,我们需要进行映射。因此,我们需要创建很多DTOs。
我知道缓存是横切关注点,因此我正在寻找更清洁的解决方案。出于这个原因,首先我决定使用Memcached进行内存缓存(而不是使用简单列表)。其次,最重要的是,我可能会从EF迁移到NHibernate以获得它的二级缓存支持。我知道一级缓存被会话对象占用。因此,我想使用Memcached作为二级缓存。但是Redis有第三级缓存吗?

关于DTO,您在使用带有代理的实体(DbContext的代理)时是否遇到问题?通常,当您尝试访问相关属性但由于延迟加载器无法访问已释放上下文而未加载时,问题就会出现,但是在分离的实体中也存在相同的问题(在这两种情况下,您都需要使用Include)。再次谈到DTO,我总是实现Clone,开始实现浅克隆(但这取决于实体),并且通常(始终)是字段值副本(使用类似于MemberwiseClone但不是MemberwiseClone的自定义函数,否则您将再次拥有整个代理)。 - bubi
@bubi 我不想为了持久化框架而妥协我的领域模型。创建DTO就像Momento模式一样。其次,我想要一个好的缓存提供程序,这是实体框架所没有的。 - Seyed Morteza Mousavi
您不会通过上述方法来妥协模型。我认为您这样做了,但如果您没有的话,可以看看适用于EF的二级缓存实现。关于Hibernate,我建议您尝试一下,看它是否能够满足您的需求。我可以说,现在(对于新项目),我使用EF,而旧项目仍然使用Hibernate。关于Hibernate的问题是,通常需要很早地实现查询材料化。如果您考虑在内存中工作,则经常/总是正常工作,但如果您需要在数据库上工作,则有时需要编写HQL或SQL(或在查询中早期插入ToList())。 - bubi
@bubi,你能在回答帖子中详细阐述一下吗?无论如何,谢谢。 - Seyed Morteza Mousavi
1个回答

2

通过使用属性名称值列表而不是存储DTO来实现二级缓存的一种方法是,使用键值列表中的属性名称值列表。据我了解,NHibernate中没有第三级缓存。一种实现方式是实现自定义缓存提供程序,该提供程序可以首先查找Redis,如果找不到,则从Memcached获取值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接