我希望通过代码清除NHibernate中的整个二级缓存.有没有办法做这个独立于正在使用的缓存提供程序?(我们让客户在同一个应用程序中同时使用memcache和syscache).
我们希望清除整个缓存,因为数据库外部可能已发生更改(我们无法保证:哪些表/实体受到影响,因此我们必须假设最坏).
我有一个相当简单的条件查询来获取子集合,如下所示:
var order = Session.CreateCriteria<Order>()
.Add(Restrictions.Eq("Id", id))
.SetFetchMode("Customer", FetchMode.Eager)
.SetFetchMode("Products", FetchMode.Eager)
.SetFetchMode("Products.Category", FetchMode.Eager)
.SetCacheable(true)
.UniqueResult<Order>();
Run Code Online (Sandbox Code Playgroud)
使用NH Prof,我已经验证这只使用冷缓存只进行一次数据库往返(如预期); 但是,在连续执行时,它仅从Order
缓存中检索,然后使用SELECT(N + 1)为图中的每个子实体命中数据库,如下所示:
Cached query: SELECT ... FROM Order this_ left outer join Customer customer2 [...]
SELECT ... FROM Customer WHERE Id = 123;
SELECT ... FROM Products WHERE Id = 500;
SELECT ... FROM Products WHERE Id = 501;
...
SELECT ... FROM Categories WHERE Id = 3;
Run Code Online (Sandbox Code Playgroud)
等等等等.显然,它不缓存整个查询或图形,只缓存根实体.第一个"缓存查询"行实际上具有join
它应该具有的所有条件 - 它肯定正确地缓存了查询本身,显然不是实体.
我已经尝试过使用SysCache,SysCache2甚至是HashTable缓存提供程序,而且我似乎总是得到同样的行为(NH版本3.2.0). …