我正在研究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時,我沒有找到它。我不確定這是否是一個好的解決方案 - 然而,性能卻增加到每秒處理數千次(或幾萬次)事件。
簡單地說,我的問題是,發出查詢時沒有找到任何尚未保存但已添加到工作單元的文檔。即我已經調用了'Store(document)',但不是'SaveChanges' - 並且之前沒有加載文檔,因爲它是一個新文檔。 – urbanhusky