01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理
http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html
管理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从数据库中读取数据时,强制二级缓存刷新
测试5:管理NHibernate二级缓存
我们可以使用ISessionFactory提供了一系列的EvictXXX()方法从二级缓存中删除一个实例,看看这个例子在第一次读取持久化实例时,结果集保存在二级缓存中,使用Evict方法从二级缓存中删除所有持久化实例,第二次查询相同数据,二级缓存中不存在则重新从数据库中查询了~~
[Test]
public void SessionFactoryManageTest()
{
ISessionFactory _sessionFactory = (new Configuration()).Configure().BuildSessionFactory();
Console.WriteLine("第一次读取持久化实例");
using (ISession _session = _sessionFactory.OpenSession())
{
Customer customer1 = _session.Get<Customer>();
Customer customer2 = _session.Get<Customer>();
}
Console.WriteLine("从二级缓存中删除Customer类所有实例");
_sessionFactory.Evict(typeof(Customer));
//也可以_sessionFactory.EvictEntity("DomainModel.Entities.Customer");
Console.WriteLine("第二次读取持久化实例");
using (ISession _session = _sessionFactory.OpenSession())
{
Customer customer1 = _session.Get<Customer>();
}
}
测试6:强制刷新缓存区域
我们使用ISession提供的.SetCacheMode(CacheMode.Refresh) 方法可以强制刷新缓存区域,这样可以避免数据不一致问题~~
[Test]
public void QueryCacheTest()
{
using (_session)
{
Console.WriteLine("第一次查询某数据,显式缓存查询结果");
IList<Customer> customers =
_session.CreateQuery("from Customer c where c.CustomerId > 2")
.SetCacheable(true)
.SetCacheRegion("queryCache")
.List<Customer>();
Assert.AreEqual(, customers.Count);
}
ResetSession();
using (_session)
{
Console.WriteLine("第二次查询某数据,显式缓存查询结果");
Console.WriteLine("----指定特定的命名缓存区域并强制刷新缓存区域----");
IList<Customer> customers =
_session.CreateQuery("from Customer c where c.CustomerId > 2")
.SetCacheable(true)
.SetCacheRegion("queryCache")
.SetCacheMode(CacheMode.Refresh)
.List<Customer>();
Assert.AreEqual(, customers.Count);
}
}
01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理的更多相关文章
- 01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存
一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/37606 ...
- 01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题
此文由于当时不知道NHibernate的Sava方法不是更新操作,不知道Save就是Add,造成如下荒唐的求证过程,但结论是对的 ,可报废此文,特此声明. NHibernate--Save方法: Cu ...
- 01-08-02【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider
第一步骤:hibernate.cfg.xml文件补上如下配置: <?xml version="1.0" encoding="utf-8"?> < ...
- 01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的一级缓存
缓存的范围? 1.事务范围 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结 ...
- 01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响
这篇文章 http://ayende.com/blog/3988/nhibernate-the-difference-between-get-load-and-querying-by-id One o ...
- 01-07-01【Nhibernate (版本3.3.1.4000) 出入江湖】并发控制
Nhibernate 并发控制 [1]悲观并发控制 正在使用数据的操作,加上锁,使用完后解锁释放资源. 使用场景:数据竞争激烈,锁的成本低于回滚事务的成本 缺点:阻塞,可能死锁 [2]乐观并发控制: ...
- 01-08-04【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之命名缓存
http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 可以在映射文件中定义命名查询,<query>元素提供了很多属性,可以用 ...
- 01-08-01【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate中的三种状态
以下属于不明来源资料: 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分这些对象,根 ...
- 01-06-01【Nhibernate (版本3.3.1.4000) 出入江湖】事务
Nhibernate事务的使用: public void Add(Customer customer) { ISession session = _sessionManager.GetSession( ...
随机推荐
- 【学习笔记】Mac OS X系统介绍
一.Dock *相当于Windows的快速启动栏,用来存放常用软件的图标 *单击软件图标即可打开相应的软件 *右击软件图标还有其他菜单选项:比如退出软件 *图标下边的黑点代表程序正在运行中,并没有完全 ...
- 解决IE8打开默认弹出开发者工具的问题
有一次开发用ie调试后再次打开总是自动弹出ie开发者工具,而且在网页的上一层弹出.点击X关闭后再次打开还是会弹出! 找ie的设置也没有找到关闭的选项. 在网上搜了很多资料才找到解决的办法,在这里分享一 ...
- (转)消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
RabbitMQ.ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼.下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了. Rab ...
- 分享9款用HTML5/CSS3制作的动物人物动画
1.纯CSS3绘制可爱的蚱蜢 还有眨眼动画 今天我们要分享一个利用纯CSS3绘制的蚱蜢动画,非常可爱. 在线演示 源码下载 2.HTML5 Canvas头发飘逸动画 很酷的HTML5动画 HTML5 ...
- 8款强大的CSS3/HTML5动画及应用源码
1.CSS3 jQuery UI控制滑杆插件 今天我们要来分享一款基于CSS3和jQuery UI的控制滑杆插件,这款控制滑杆是在HTML5滑杆元素的基础上进行自定义CSS3渲染,所以外观更加漂亮.另 ...
- tomcat中的get、post区别
最近做一个项目,前台传到后台的数据是乱码.看着代码应该是正确的,但是就是有问题,然后请教了旁边的老司机才找到问题是什么.话不多说,下面是模拟情景的代码,其实也很简单,前台一个form表单,post ...
- Linux 内存布局
本文主要简介在X86体系结构下和在ARM体系结构下,Linux内存布局的概况,力求简单明了,不过多深入概念,多以图示的方式来记忆理解,一图胜万言. Technorati 标签: 内存 布局 ...
- c# 取得ip地址和网关
/// <summary> /// 得到本机IP /// </summary> private string GetLocalIP() { //本机IP地址 string st ...
- ios 控件
反序列化 JSONModel 上拉刷新 下拉加载更多 MJRefresh AFNetworking 2.5 Asynchronous image downloader with cache - SDW ...
- Google Chrome七大新特性
Google Chrome 在日常生活中扮演的角色不只是一个功能强大的网络浏览器,它内置的 DevTools 同样也是网络开发者进行网络开发的重要工具. DevTools 在不断的进行版本更新,其中有 ...