Восстановление 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
здесь написано, но он не дает четкого ответа на этот вопрос.
Или может быть есть другие способы сделать это?