Восстановление MapDb после сбоя JVM

В настоящее время у меня есть hashmap, созданный из mapDb на основе файла. Я использую эту карту для локального сохранения некоторых данных на сервере (мне не нужны другие серверы для доступа к этим данным), поэтому мне нужно, чтобы эти данные были доступны после перезапуска jvm. И это прекрасно работает.

Тем не менее, я также должен покрыть случай, когда jvm умирает. Это означает, что мы не можем гарантировать, что db.close() будет вызван, но мне все еще нужно получить данные после восстановления.

Вот как создается карта:

    DB db = DBMaker
            .fileDB(storagePath)
            .closeOnJvmShutdown()
            .fileMmapEnableIfSupported()
            .fileMmapPreclearDisable()
            //.checksumHeaderBypass()
            //.transactionEnable() 
            .allocateStartSize(entries * avgEntrySize)
            .make();
    db.getStore().fileLoad();
    Map map = db.hashMap("map", Serializer.LONG, Serializer.ELSA).createOrOpen();

Я нашел два способа сделать это:

  • добавлять checksumHeaderBypass опция при создании dbНо интересно, какие могут быть последствия? Может ли быть так, что в этом случае БД может вернуть некоторые противоречивые данные после восстановления? Я спрашиваю, потому что в качестве альтернативы я использовал chronicleMap и это также имеет close() метод, но он не заставляет этот вызов выполняться перед перезапуском jvm.
  • добавлять transactionEnable вариант, но тогда мне нужно позвонить commit после каждого обновления или реализовать какую-нибудь оболочку, которая будет это делать. Но тогда вопрос в том, что commit на самом деле делать на каждый звонок? и как это повлияет на производительность? он будет сбрасывать mmaped файл на диск? Я использую mmaped файлы, потому что мне нужен действительно быстрый доступ к данным. Частично о commit здесь написано, но он не дает четкого ответа на этот вопрос.

Или может быть есть другие способы сделать это?

0 ответов

Другие вопросы по тегам