【问题标题】:Query RavenDB index inside session - session is not a unit of work?在会话中查询 RavenDB 索引 - 会话不是工作单元?
【发布时间】:2016-06-07 09:47:56
【问题描述】:

我正在研究 CQRS/ES 架构的概念验证,我们正在评估 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 会话在查询时不充当工作单元?

我不想将键(仓库、位置、项目)添加到文档标识符中,因为文档不鼓励这样做。

我还有哪些其他选项可用于在我的投影中快速创建或更新文档?

更新

如果我在自己的工作单元(即字典)中跟踪文档并且只在我没有找到会话/数据库时才点击它,它似乎可以工作。我不确定这是否是一个好的解决方案 - 但是性能确实提高到每秒处理数千(或数万)个事件。

【问题讨论】:

    标签: c# indexing ravendb unit-of-work


    【解决方案1】:

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

    【讨论】:

    • 简单地说我的问题是,任何尚未保存但已添加到工作单元的文档,在发出查询时都找不到。 IE。我已经调用了Store(document),但没有调用SaveChanges - 我之前没有加载该文档,因为它是一个新文档。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2012-02-13
      相关资源
      最近更新 更多