NHibernate学习(6)—使用缓存
2009-10-07 23:52 小郝(Kaibo Hao) 阅读(621) 评论(0) 编辑 收藏 举报
一级缓存
1. 使用ISession.Get()方法立即把对象实例保存到缓存中,使用ISession.Load()方法当你需要使用的时候再访问数据库把这个实例保存在缓存中。
2. NHibernate一级缓存管理
使用ISession.Get()方法立即把对象实例保存到缓存中,使用ISession.Load()方法当你需要使用的时候再访问数据库把这个实例保存在缓存中。
在测试时发现一个问题调用Get方法时,一级缓存并不起作用,调用Load方法就可以。这点是不是NHibernate2.1.0的改变呢?对于二级缓存的测试也是如此...
刚才又好好的看了下,原来是之前的测试把数据删除了,新添的用户是以id为3开始的用下面的代码是可以查到的,原来是自己的一时粗心所致...
这是目前我学习笔记的最新代码:NHibernateSample3.zip
本文部分内容引自: YJingLee's Blog
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;
}
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从数据库中读取数据时,强制二级缓存刷新
这是目前我学习笔记的最新代码:NHibernateSample3.zip
本文部分内容引自: YJingLee's Blog
作者:小郝
出处:http://www.cnblogs.com/haokaibo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/haokaibo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。