代码改变世界

NHibernate学习(6)—使用缓存

2009-10-07 23:52  小郝(Kaibo Hao)  阅读(621)  评论(0编辑  收藏  举报
一级缓存
1.  使用ISession.Get()方法立即把对象实例保存到缓存中,使用ISession.Load()方法当你需要使用的时候再访问数据库把这个实例保存在缓存中。
2. NHibernate一级缓存管理

  ISession.Evict(object):从缓存中删除指定实例。

  ISession.Clear():清空缓存。

  ISession.Contains(object):检查缓存中是否包含指定实例
使用ISession.Get()方法立即把对象实例保存到缓存中,使用ISession.Load()方法当你需要使用的时候再访问数据库把这个实例保存在缓存中。
在测试时发现一个问题调用Get方法时,一级缓存并不起作用,调用Load方法就可以。这点是不是NHibernate2.1.0的改变呢?对于二级缓存的测试也是如此...
刚才又好好的看了下,原来是之前的测试把数据删除了,新添的用户是以id为3开始的用下面的代码是可以查到的,原来是自己的一时粗心所致...
 [Test]
        
public void SessionFactoryCacheTest()
        
{
            
using (_session)
            
{
                Console.WriteLine(
"--Session 1--读取持久化实例--");
                Customer customer1 
= _session.Get<Customer>(3);
                Assert.IsNotNull(customer1);
            }

            ResetSession();
            
using (_session)
            
{
                Console.WriteLine(
"--Session 2--读取持久化实例--");
                Customer customer2 
= _session.Get<Customer>(3);
                Assert.IsNotNull(customer2);
            }

        }
   private void ResetSession()
        {
            if (_session.IsOpen)
                _session.Close();
            _session = _helper.GetSession();
            _sample.Session = _session;
        }


管理NHibernate二级缓存

NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护。我们使用NHibernate操 作数据时,ISessionFactory能够自动同步缓存,保证缓存的有效性。但是当我们批量操作数据时,往往NHibernate不能维护缓存持久有 效。ISessionFactory提供了可编程方式的缓存管理方法。

ISessionFactory提供了一系列的EvictXXX()方法可以方便的从二级缓存中删除一个实例、删除一个集合、一个命名缓存等操作

  • Evict(persistentClass):从二级缓存中删除persistentClass类所有实例
  • Evict(persistentClass, id):从二级缓存中删除指定的持久化实例
  • EvictEntity(entityName):从二级缓存中删除命名实例
  • EvictCollection(roleName):从二级缓存中删除集合
  • EvictCollection(roleName, id):从二级缓存中删除指定的集合
  • EvictQueries():从二级缓存中刷新全部查询结果集
  • EvictQueries(cacheRegion):从二级缓存中刷新指定查询结果集

ISession内置缓存可以共享ISessionFactory缓存,通过指定ISession的CacheMode可以控制ISession和ISessionFactory的交互方式。ISession可以通过以下五种方式和ISessionFactory交互:

  • Ignore:更新数据时将二级缓存失效,其它时间不和二级缓存交互
  • Put:向二级缓存写数据,但不从二级缓存读数据
  • Get:从二级缓存读数据,仅在数据更新时向二级缓存写数据
  • Normal:默认方式。从二级缓存读/写数据
  • Refresh:向二级缓存写数据,想不从二级缓存读数据,通过在配置文件设置cache.use_minimal_puts从数据库中读取数据时,强制二级缓存刷新
李永京的NHibernate之旅就到更新到这里,相信以后还有更多精彩的文章,但是我的NHibernate学习笔记才刚刚开始...
这是目前我学习笔记的最新代码:NHibernateSample3.zip
本文部分内容引自: YJingLee's Blog