2016-06-07 70 views
0

我正在研究CQRS/ES架构的概念验证,我们正在评估RavenDB作为一些读取模型的潜在文档存储。在会话中查询RavenDB索引 - 会话不是工作单元?

我使用异步会话IAsyncDocumentSession的原因有两个:

  • 读取模型投影管道是完全异步和交错处理
  • 优化,我希望有一个工作单元与内存缓存应该会提高性能

但是,当我运行查询(使用索引)时,即使指定了WaitForNonStaleResultsAsOfLastWrite,我也没有收到已添加到当前会话中的文档。 这意味着我无法更新这些文档,而是最终创建新文档。

我使用存储库访问RavenDB:

public async Task<ItemDistribution> FindAsync(Guid warehouse, Guid location, Guid item) 
{ 
    var list = await this.Session 
     .Query<ItemDistribution, ItemDistribution_WarehouseLocationItem>() 
     .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()) 
     .Where(x => x.Warehouse == warehouse && x.Location == location && x.Item == item) 
     .ToListAsync(); 
    // split for debugging purposes 
    return list.SingleOrDefault(); 
} 

有一次,我打电话SaveChangesAsync(),这将导致被添加到存储和一个查询的文件,然后找到保存的文档。

对我而言,这将表明RavenDB会话在查询时不会充当工作单元吗?

我不想将密钥(仓库,位置,项目)添加到文档标识符,因为文档不鼓励。

我有哪些其他选项可以在我的预测中快速创建或更新文档?

更新

看来,如果我跟踪我自己的工作单位的文件(即一本字典)仅命中会话中工作/ DB时,我没有找到它。我不确定这是否是一个好的解决方案 - 然而,性能却增加到每秒处理数千次(或几万次)事件。

回答

0

查询不是会话工作单元的一部分。

结果可能会添加到工作单元中,但实际查询是针对数据库运行的。 这里我的问题的解决方案是为文档使用复合密钥并直接使用Load

0

RavenDB会话实现工作单元模式。 我无法解决帖子中所述的问题,但通常,会话中的任何文档(通过LoadQuery)都由RavenDB会话进行跟踪,并在调用SaveChanges时检查更改。

+0

简单地说,我的问题是,发出查询时没有找到任何尚未保存但已添加到工作单元的文档。即我已经调用了'Store(document)',但不是'SaveChanges' - 并且之前没有加载文档,因为它是一个新文档。 – urbanhusky