在会话中查询 RavenDB 索引 - 会话不是一个工作单元?
Query RavenDB index inside session - session is not a unit of work?
我正在研究 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 会话在查询时不充当工作单元吗?
我不想将键(仓库、位置、项目)添加到文档标识符中,因为文档不鼓励这样做。
我还有哪些其他选项可用于在我的投影中快速创建或更新文档?
更新
如果我在我自己的工作单元(即字典)中跟踪文档并且只在我没有找到它时才点击 session/DB,这似乎可行。我不确定这是否是一个好的解决方案 - 但是性能确实提高到每秒处理数千(或数万)个事件。
RavenDB 会话实现了工作单元模式。
我无法解决 post 中所述的问题,但总的来说,会话中的任何 文档 (通过 Load
或 Query
) 由 RavenDB 会话跟踪,并将在调用 SaveChanges
时检查更改。
查询不是会话工作单元的一部分。
结果可能会添加到工作单元中,但实际查询是针对数据库运行的。
我这里的问题的解决方法是对文档使用复合键,直接使用Load
。
我正在研究 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 会话在查询时不充当工作单元吗?
我不想将键(仓库、位置、项目)添加到文档标识符中,因为文档不鼓励这样做。
我还有哪些其他选项可用于在我的投影中快速创建或更新文档?
更新
如果我在我自己的工作单元(即字典)中跟踪文档并且只在我没有找到它时才点击 session/DB,这似乎可行。我不确定这是否是一个好的解决方案 - 但是性能确实提高到每秒处理数千(或数万)个事件。
RavenDB 会话实现了工作单元模式。
我无法解决 post 中所述的问题,但总的来说,会话中的任何 文档 (通过 Load
或 Query
) 由 RavenDB 会话跟踪,并将在调用 SaveChanges
时检查更改。
查询不是会话工作单元的一部分。
结果可能会添加到工作单元中,但实际查询是针对数据库运行的。
我这里的问题的解决方法是对文档使用复合键,直接使用Load
。