RavenDb学习(九)高级特性下半部分
.聚合缓存 RavenDb默认是缓存所有的请求url的,最大的缓存请求数默认是2048 documentStore.Conventions.ShouldCacheRequest = url => true; documentStore.MaxNumberOfCachedRequests = ; 如果开启这个选项,RavenDb直接从缓存当中读取数据,而不是从服务端。 //关闭跟踪 documentStore.Conventions.ShouldAggressiveCacheTrackChanges = false; ))) { var user = session.Load<User>("users/1"); } ))) { var user = session.Load<User>("users/1"); } //启动强制检查更新,在SaveChanges之后 documentStore.Conventions.ShouldSaveChangesForceAggresiveCacheCheck = true; 、客户端Listener Document Conflict listeners (IDocumentConflictListener), Document Conversion listeners (IDocumentConversionListener) Document Delete listeners (IDocumentDeleteListener) Document Query listeners (IDocumentQueryListener) Document Store listeners (IDocumentStoreListener) 例子1: public class TakeNewestConflictResolutionListener : IDocumentConflictListener { public bool TryResolveConflict(string key, JsonDocument[] conflictedDocs, out JsonDocument resolvedDocument) { var maxDate = conflictedDocs.Max(x => x.LastModified); resolvedDocument = conflictedDocs.FirstOrDefault(x => x.LastModified == maxDate); return resolvedDocument != null; } } 例子2: public class Custom { public string Id { get; set; } public string Name { get; set; } public string Value { get; set; } } public class MetadataToPropertyConversionListener : IDocumentConversionListener { public void EntityToDocument(string key, object entity, RavenJObject document, RavenJObject metadata) { if (entity is Custom == false) return; document.Remove("Value"); } public void DocumentToEntity(string key, object entity, RavenJObject document, RavenJObject metadata) { if (entity is Custom == false) return; ((Custom)entity).Value = metadata.Value<string>("Raven-Document-Revision"); } } 例子3: public class FailDelete : IDocumentDeleteListener { public void BeforeDelete(string key, object entityInstance, RavenJObject metadata) { throw new NotSupportedException(); } } 例子4: public class NonStaleQueryListener : IDocumentQueryListener { public void BeforeQueryExecuted(IDocumentQueryCustomization customization) { customization.WaitForNonStaleResults(); } } 例子5: public class FilterForbiddenKeysDocumentListener : IDocumentStoreListener { private readonly IList<string> forbiddenKeys = new List<string> { "system" }; public bool BeforeStore(string key, object entityInstance, RavenJObject metadata, RavenJObject original) { return this.forbiddenKeys.Any(x => x.Equals(key, StringComparison.InvariantCultureIgnoreCase)) == false; } public void AfterStore(string key, object entityInstance, RavenJObject metadata) { } } 、批量插入 //批量插入代码示例 using (var bulkInsert = store.BulkInsert()) { ; i < * ; i++) { bulkInsert.Store(new User { Name = "Users #" + i }); } } //批量插入接口原型 public interface IDocumentStore { BulkInsertOperation BulkInsert(string database = null, BulkInsertOptions options = null); } //批量插入选项原型 public class BulkInsertOptions { public bool CheckForUpdates { get; set; } public bool CheckReferencesInIndexes { get; set; } public int BatchSize { get; set; } } //批量插入操作原型 public class BulkInsertOperation { public delegate void BeforeEntityInsert(string id, RavenJObject data, RavenJObject metadata); public event BeforeEntityInsert OnBeforeEntityInsert = delegate { }; public event Action<string> Report { ... } public void Store(object entity) { ... } public void Store(object entity, string id) { ... } } 、流式查询 默认的分页查询的,但是有时候,我们需要一次性查询,RavenDb提供了一种流式查询的方式 //正常查询 var query = session.Query<User>("Users/ByActive").Where(x => x.Active); using (var enumerator = session.Advanced.Stream(query)) { while (enumerator.MoveNext()) { User activeUser = enumerator.Current.Document; } } //lucene查询 var luceneQuery = session.Advanced.LuceneQuery<User>("Users/ByActive").Where("Active:true"); using (var enumerator = session.Advanced.Stream(luceneQuery)) { while (enumerator.MoveNext()) { User activeUser = enumerator.Current.Document; } } //接口原型 QueryHeaderInformation queryHeaderInformation; session.Advanced.Stream(query, out queryHeaderInformation); public class QueryHeaderInformation { public string Index { get; set; } public bool IsStable { get; set; } public DateTime IndexTimestamp { get; set; } public int TotalResults { get; set; } public Etag ResultEtag { get; set; } public Etag IndexEtag { get; set; } } //分页 using (var enumerator = session.Advanced.Stream<User>(fromEtag: Etag.Empty, start: , pageSize: int.MaxValue)) { while (enumerator.MoveNext()) { User activeUser = enumerator.Current.Document; } } // using (var enumerator = session.Advanced.Stream<User>(startsWith: "users/", matches: "*Ra?en", start: , pageSize: int.MaxValue)) { while (enumerator.MoveNext()) { User activeUser = enumerator.Current.Document; } } //异步版本 using (var asyncSession = store.OpenAsyncSession()) { var query = asyncSession.Query<User>("Users/ByActive").Where(x => x.Active); using (var enumerator = await asyncSession.Advanced.StreamAsync(query)) { while (await enumerator.MoveNextAsync()) { User activeUser = enumerator.Current.Document; } } using (var enumerator = await asyncSession.Advanced.StreamAsync<User>(Etag.Empty)) { while (await enumerator.MoveNextAsync()) { User activeUser = enumerator.Current.Document; } } }
RavenDb学习(九)高级特性下半部分的更多相关文章
- php面向对象编程学习之高级特性
前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...
- Python学习札记(十九) 高级特性5 迭代器
参考:迭代器 Note 1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数.这些可以直接作用 ...
- Python学习之高级特性
切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...
- python学习之高级特性:
切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...
- python切片、迭代、生成器、列表生成式等高级特性学习
python高级特性 1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 切片 当我们要取一个list中的前n各元素时,如果前n个少的话,我们还可以一个一个的取,但是若前n个元 ...
- Python3学习(二)-递归函数、高级特性、切片
##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- JavaScript高级特性-创建对象的九种方式
1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...
- Python学习札记(十五) 高级特性1 切片
参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...
随机推荐
- wget for windows
那么,来尝试下wget for windows 吧. 什么是wget? wget是一个强力方便的命令行下的下载工具,可以通过HTTP和FTP协议(两种最广泛的互联网协议)从因特网中检索并获取文件. 此 ...
- Flowable 的event介绍
1 事件分为两种,一种是抛出:当流程执行到这时,抛出一个事件:另一种是捕获:当流程执行到这时,他就会等待一个事件的发生. 一个事件需要有事件定义,否则不会做任何“特殊”的事.对于一个流程实例,一个开始 ...
- 怎么在linux 用nginx做代理 配置.net core
1. 安装 .net core到centos7 2. 安装nginx 配置代理: vim /opt/nginx/conf/nginx.conf server { listen 80; server_n ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- 配置并使用Android支持的库
原文链接:http://android.eoe.cn/topic/android_sdk Android Support Library(支持库)提供了包含一个API库的JAR文件,当你的应用运行在A ...
- Android百日程序 开篇章:Intent打开网页
学习一下人家100日写100个网页的做法,我也用100日写100个完整的Android程序. 这些程序的最基本要求: 1 完整性-每一个程序都必须是独立可执行的 2 不反复性-所用的重点知识点都不一样 ...
- 程序包org.junit不存在和编码GBK的不可映射字符问题解决
maven项目在打包编译时提示: 解决办法: 将pom中junit依赖中的scope给注释掉 <dependency> <groupId>junit</groupId&g ...
- 配置ssh的config文件-为每个ssh连接创建别名
其实选来选去,还是iterm2就够用了,唯一比较麻烦的就是每次都有输入地址和用户名,其实,可以通过配置文件简写的. 可以在 ~/.ssh/config文件写上配置alias信息,以后ssh的时候根据a ...
- Unity创建一个简易的弹簧(弹动)效果
参考文章:http://www.cnblogs.com/SkyD/archive/2008/09/05/1284778.html 主要依据胡克公式F=-k·x.这里k是倔度系数,可以理解为k值越大弹性 ...
- 行为类模式(七):观察者(Observer)
定义 定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. UML 优点 观察者和被观察者之间是松耦合的,分别可以各自独立改变. Subject在发送 ...