RavenDB - кеширование? «Устаревание»? Почему обновленные документы не возвращаются вместе с обновлениями? - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь преобразовать свой собственный блог из MSSQL / EF в RavenDB, и по большей части он до сих пор был довольно безболезненным, но у меня возникла проблема с тем, что, как я подозреваю, является «устаревшими индексами» или чрезмерноНапористое кеширование, но я не могу получить никаких реальных ответов.Проще продемонстрировать, чем объяснить, когда я не знаю, в чем собственно проблема.

Настройка:

// Basic example class
public class ExampleClass{
    public int ID {get;set;}
    public string Value {get;set;}
}

// Once at application startup:
_docStore = new DocumentStore {
    Url = "http://localhost:8080",
    DefaultDatabase = "exampleDB",
    Credentials = new NetworkCredential("userfoo","passbar"),
    };            
_docStore.Initialize();

// Querying data:    
using (var session = _docStore.OpenSession())
{
    var results = _session.Query<ExampleClass>().ToList();        
    foreach(var result in results)
    {
        Console.WriteLine(string.Format("ID #{0}: {1}",
          result.ID, result.Value));
    }
}

Проблема в следующем: Всякий раз, когда я обновляю документы программно через сеанс _docStore, все работает нормально.Когда я редактирую данные извне (из другого клиента, в студии управления RavenDB и т. Д.), Обновления документа не возвращаются.Вот несколько примеров.


1) Начальные значения в базе данных

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1, "Value": "foo",}
  • ExampleClass / 2 {"ID": 2, "Value": "bar",}

Выполнить запрос;Результат консоли:

  • ID # 1: foo
  • ID # 2: bar

2) После обновленияЗначение ExampleClass / 2 для "BAR" через сеанс _docStore.

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1, "Value": "foo",}
  • ExampleClass / 2 {"ID": 2, "Value": "BAR",}

Выполнить запрос;Результат консоли:

  • ID # 1: foo
  • ID # 2: BAR

3) После обновленияЗначение ExampleClass / 2 для "bah" через RavenDB studio

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1,"Value": "foo",}
  • ExampleClass / 2 {"ID": 2, "Value": "bah",}

Выполнить запрос;консольный результат:

  • ID # 1: foo
  • ID # 2: BAR

4) После добавленияExampleClass / 3 через RavenDB studio

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1, "Значение": "foo ",}
  • ExampleClass / 2 {" ID ": 2," Value ":" bah ",}
  • ExampleClass / 3 {" ID ": 3," Value ":"спам ",}

Выполнить запрос;Результат консоли:

  • ID # 1: foo
  • ID # 2: BAR
  • ID # 3: спам

5) После удаления ExampleClass / 2 через RavenDB studio

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1, "Value": "foo",}
  • ExampleClass / 3 {"ID": 3, "Value": "spam",}

Выполнить запрос;результат консоли:

  • ID # 1: foo
  • ID # 3: спам

6) После измененияЗначение ExampleClass / 3 через RavenDB studio

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1, "Value":"foo",}
  • ExampleClass / 3 {"ID": 3, "Value": "SPAM",}

Выполнить запрос;консольный результат:

  • ID # 1: foo
  • ID # 3: спам

6) После добавленияExampleClass / 4 через RavenDB studio

Документы в базе данных:

  • ExampleClass / 1 {"ID": 1, "Значение": "foo ",}
  • ExampleClass / 3 {" ID ": 3," Value ":" СПАМ ",}
  • ExampleClass / 4 {" ID ": 4," Value ":"bar ",}

Выполнить запрос;Результат консоли:

  • ID # 1: foo
  • ID # 3: спам
  • ID # 4: bar

* 7) После инициализации нового хранилища документов (без изменений данных) *

Документы в базе данных:

  • ExampleClass/ 1 {"ID": 1, "Value": "foo",}
  • ExampleClass / 3 {"ID": 3, "Value": "SPAM",}
  • ExampleClass/ 4 {"ID": 4, "Значение": "bar",}

Выполнить запрос;консольный результат:

  • ID # 1: foo
  • ID # 3: СПАМ
  • ID # 4: бар

Надеюсь, это достаточно хорошо показывает, где что-то идет не так. Добавление и удаление целых документов отражается нормально, но обновления полностью игнорируются после первой загрузки, что заставляет меня подозревать кэширование, а не «устаревший индекс» ... но я пробовал подобные вещи без удачи:

// After initialising document store:
_docStore.DisableAggressiveCaching();
_docStore.DatabaseCommands.DisableAllCaching();
_docStore.Conventions.DefaultQueryingConsistency =
  ConsistencyOptions.QueryYourWrites;

// Whenever opening a new session:
_session.Advanced.DatabaseCommands.DisableAllCaching();
_session.Advanced.AllowNonAuthoritativeInformation = false;                

// When querying:
var result = _session.Query<ExampleClass>()
  .Customize(x=>x.WaitForNonStaleResults())
  .ToList();

Что происходит! $ # *? Почему RavenDB ненавидит меня?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

RavenDB выполняет кеширование, но проверяет etag, поэтому вы не должны этого видеть. Возможно ли, что вы всегда используете один сеанс?

Можете ли вы попробовать воспроизвести это?

0 голосов
/ 03 апреля 2012

Похоже, что docStore всегда возвращает один и тот же сеанс, который соответствует предложению Орен. Использование текущих (1.0.701) библиотек RavenDB решило проблему.

...