2016-06-07 67 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