2016-06-07 2 views
0

Я работаю над концепцией архитектуры CQRS/ES, и мы оцениваем RavenDB как потенциальный хранилище документов для некоторых моделей чтения.Query RavenDB index внутри сеанса - сеанс не является единицей работы?

Я использую асинхронный сеанс 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 не действует как единица работы при запросе?

Я не хотел добавлять ключ (склад, местоположение, элемент) к идентификатору документа, потому что документация препятствует этому.

Какие еще существуют варианты для быстрого создания или обновления документов в моих проекциях?

Update

Это похоже на работу, если отслеживать документы в моей собственной единицы работы (т.е. словарь) и только ударил сессию/DB, когда я не нашел его. Я не уверен, что это хорошее решение. Однако производительность увеличилась до нескольких тысяч (или десятков тысяч) событий в секунду.

ответ

0

Запросы не входят в единицу работы сессии.

Результаты могут быть добавлены в единицу работы, но фактический запрос выполняется против БД. Решение моей проблемы здесь заключается в использовании составного ключа для документа и непосредственно использовании Load.

0

Сеанс RavenDB реализует единицу рабочего шаблона. я был не в состоянии следовать этой проблемы, как указано в посте, но в общем, любой документ в сессии (через Load или Query) отслеживается сессии RavenDB, и будут проверяться на наличие изменений, когда SaveChanges называется ,

+0

Проще говоря, проблема заключается в том, что любые документы, которые еще не сохранены, но были добавлены в единицу работы, не найдены при выдаче запроса. То есть Я назвал 'Store (document)', но не 'SaveChanges', и я ранее не загружал документ, потому что это новый документ. – urbanhusky

Смежные вопросы