在使用ORM之前,我们总是在服务层中执行对象缓存。这使我们能够在不同的数据层之间切换,而无需更改我们的缓存实现。
现在我们使用Entity Framework(主要是代码优先)和NHibernate。 NHibernate似乎有更好的缓存功能,可以使用多个二级缓存提供程序。
我面临的另一个问题是,对于上述两个ORM,我们都使用了延迟加载的属性。因此,如果我们从缓存中检索一个对象,我们通常必须将它重新附加到当前的ObjectContext / ISession,这是我们在服务层中无法实现的。
所以我真的应该考虑在存储库/数据层实现缓存;我是否有可能找到适用于EF和NH的通用解决方案?
由于 本
答案 0 :(得分:4)
你看过CQRS pattern了吗?因为caching is policy,我怀疑尝试使用“一刀切”缓存(如第二层缓存)自动执行这些决策。例如,如果你真正想要缓存的是你网站主页的HTML,那么第二层缓存只是浪费内存和臭虫邀请。
CQRS将这些机械考虑因素转化为政策决策。它与ORM无关。
答案 1 :(得分:2)
我的经验是,ORM提供的二级缓存将根据从数据库中检索到的实际结果集缓存数据。这会给你带来很多开销,因为对象实例化和数据填充非常昂贵。
优点是延迟加载等可以正常工作,但重新填充对象时,大结果仍然会占用大量资源。
我们在web应用程序中使用二级缓存和ASP.NET缓存的组合,因为代价高昂,在极少数情况下会节省我们几秒钟(!),但缺点是无法使用延迟加载集合或更新实体。
这仅基于NHibernate,我从未使用过实体框架,但我猜测所有ORM框架都受此影响。