NHibernate一级缓存
Nhibernate一级缓存对当前Session 实例有效
一级缓存管理:
ISession.Evict(object):从缓存中删除指定实例。
ISession.Clear():清空缓存。
ISession.Contains(object):检查缓存中是否包含指定实例。
使用Get和Load的缓存查询策略
//Load和Get区别Get = new LoadType("Get") .SetAllowNulls(true) .SetAllowProxyCreation(false) .SetCheckDeleted(true) .SetNakedEntityReturned(false) .SetExactPersister(true); // NH: Different behavior to pass NH-295 Load = new LoadType("Load") .SetAllowNulls(false) .SetAllowProxyCreation(true) .SetCheckDeleted(true) .SetNakedEntityReturned(false);
//具体处理if (options.IsAllowProxyCreation) { return CreateProxyIfNecessary(@event, persister, keyToLoad, options, persistenceContext); } else { // return a newly loaded object return Load(@event, persister, keyToLoad, options); } }
由上可以看出,除了在查询不到数据时返回结果不同(get返回null,Load返回异常),主要的不同是Get和Load对创建代理的策略不同:
Get的访问顺序:一级缓存=》二级缓存=》数据库(如果缓存中存在对象时使用Get也不会查询数据库)(Get同样支持对数据的延迟加载和预加载)
Load的访问顺序:一级缓存=》创建代理(在实际使用到对象中的数据的时候再查询二级缓存和数据库)也就是说Load抛出异常的时间不是创建代理的时间,而是在查询其中具体数据时检索不到数据,此时由于代理无法填充而抛出的异常(在取Load查询出的数据时,如果代理中存在的对象,Load会直接返回代理中的数据,而不会发出实际对数据库的查询,也就不会受到配置文件中延迟加载和预加载的限制,如果要查询的值代理中不存在,需要检索数据库时,Load发出的查询也是按照配置文件中加载策略限制的)
Load的主要应用:
使用ORM时经常会出现首先获得数据,加载到缓存中然后才能对实体进行更改或关联再加载入数据库的情况,即:select+update(insert)影响数据库性能,使用Load时可以在一定程度上避免这类情况的发生