Рубрики
Без рубрики

Путеводитель по MapDB

Узнайте о MapDB, легкой библиотеке настойчивости, которая предоставляет API для хранения и получения данных.

Автор оригинала: Sam Millington.

1. Введение

В этой статье мы посмотрим на MapDB библиотека — встроенный движок базы данных, доступный через API, похожий на коллекцию.

Начнем с изучения основных классов DB и DBMaker которые помогают настроить, открыть и управлять нашими базами данных. Затем мы погрузимся в некоторые примеры структур данных MapDB, которые хранят и извлекают данные.

Наконец, мы посмотрим на некоторые режимы памяти, прежде чем сравнивать MapDB с традиционными базами данных и Java Collections.

2. Хранение данных в MapDB

Во-первых, давайте представим два класса, которые мы будем использовать постоянно на протяжении всего этого учебника – DB и DBMaker. DB класс представляет собой открытую базу данных. Его методы вызывают действия по созданию и закрытию коллекций хранилищ для обработки записей баз данных, а также обработки транзакционных событий.

DBMaker обрабатывает конфигурацию базы данных, создание и открытие. В рамках конфигурации мы можем разместить нашу базу данных либо в памяти, либо в нашей файловой системе.

2.1. Простой пример HashMap

Чтобы понять, как это работает, давайте немедленно новую базу данных в памяти.

Во-первых, давайте создадим новую базу данных памяти с помощью DBMaker класс:

DB db = DBMaker.memoryDB().make();

Однажды наш DB объект запущен, мы можем использовать его для создания HTreeMap для работы с нашими записями базы данных:

String welcomeMessageKey = "Welcome Message";
String welcomeMessageString = "Hello Baeldung!";

HTreeMap myMap = db.hashMap("myMap").createOrOpen();
myMap.put(welcomeMessageKey, welcomeMessageString);

HTreeMap является MapDB HashMap реализация. Итак, теперь, когда у нас есть данные в нашей базе данных, мы можем получить их с помощью получить метод:

String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey);
assertEquals(welcomeMessageString, welcomeMessageFromDB);

Наконец, теперь, когда мы закончили с базой данных, мы должны закрыть ее, чтобы избежать дальнейшей мутации:

db.close();

Чтобы хранить наши данные в файле, а не в памяти, все, что нам нужно сделать, это изменить способ, что наши DB объект мгновенно:

DB db = DBMaker.fileDB("file.db").make();

В нашем приведении выше не используются параметры типа. В результате, мы застряли с литья наши результаты для работы с конкретными типами. В нашем следующем примере мы представим Сериализаторы для устранения необходимости литья.

2.2. Коллекции

MapDB включает в себя различные типы коллекций. Чтобы продемонстрировать, давайте добавим и извлекаем некоторые данные из нашей базы данных с помощью Навигационаясеть , который работает, как вы могли бы ожидать от Java Установить :

Начнем с простого мгновенного о нашего DB объект:

DB db = DBMaker.memoryDB().make();

Далее, давайте создадим наш Навигационаясеть :

NavigableSet set = db
  .treeSet("mySet")
  .serializer(Serializer.STRING)
  .createOrOpen();

Вот, сериализатор гарантирует, что входные данные из нашей базы данных будут сериализованы и дезериализированы с Струнные Объектов.

Далее, давайте добавим некоторые данные:

set.add("Baeldung");
set.add("is awesome");

Теперь давайте проверим, что наши два различных значения были добавлены в базу данных правильно:

assertEquals(2, set.size());

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

set.add("Baeldung");

assertEquals(2, set.size());

2.3. Сделки

Многое, как традиционные базы данных, DB класс предоставляет методы для совершить и откат данные, которые мы добавляем в нашу базу данных.

Чтобы включить эту функциональность, мы должны инициализировать наши DB с транзакцияИмная метод:

DB db = DBMaker.memoryDB().transactionEnable().make();

Далее давайте создадим простой набор, добавим некоторые данные и за коммитем их в базу данных:

NavigableSet set = db
  .treeSet("mySet")
  .serializer(Serializer.STRING)
  .createOrOpen();

set.add("One");
set.add("Two");

db.commit();

assertEquals(2, set.size());

Теперь давайте добавим третью незавершенную строку в нашу базу данных:

set.add("Three");

assertEquals(3, set.size());

Если мы не довольны нашими данными, мы можем откатить данные с помощью Откат DB метод:

db.rollback();

assertEquals(2, set.size());

2.4. Сериализаторы

MapDB предлагает большое разнообразие сериализаторы, которые обрабатывают данные в . Наиболее важным параметром строительства является имя, которое определяет индивидуальную коллекцию в DB объект:

HTreeMap map = db.hashMap("indentification_name")
  .keySerializer(Serializer.STRING)
  .valueSerializer(Serializer.LONG)
  .create();

В то время как сериализация рекомендуется, она необязательна и может быть пропущена. Тем не менее, стоит отметить, что это приведет к замедлению общего процесса сериализации.

3. HTreeMap

Карта HTreeMap обеспечивает HashMap и HashSet коллекции для работы с нашей базой данных. HTreeMap является сегментированным хэш-деревом и не использует хэш-таблицу фиксированного размера. Вместо этого он использует дерево индекса автоматического расширения и не перефразировать все свои данные по мере роста таблицы. В доверую, HTreeMap является безопасным потоком и поддерживает параллельные пишет с использованием нескольких сегментов.

Для начала, давайте немедленно простой HashMap который использует Струнные как для ключей, так и для значений:

DB db = DBMaker.memoryDB().make();

HTreeMap hTreeMap = db
  .hashMap("myTreeMap")
  .keySerializer(Serializer.STRING)
  .valueSerializer(Serializer.STRING)
  .create();

Выше мы определили отдельные сериализаторы для ключа и значения. Теперь, когда наши HashMap создается, давайте добавим данные с помощью положить метод:

hTreeMap.put("key1", "value1");
hTreeMap.put("key2", "value2");

assertEquals(2, hTreeMap.size());

Как HashMap работает на Хэш-код объекта метод, добавление данных с использованием одного и того же ключа приводит к перезаписи значения:

hTreeMap.put("key1", "value3");

assertEquals(2, hTreeMap.size());
assertEquals("value3", hTreeMap.get("key1"));

4. Отсортированная Карта

Карта СортировкаTableMap хранит ключи в таблице фиксированного размера и использует двоичный поиск для поиска. Стоит отметить, что после того, как подготовлена, карта читается только.

Давайте пройдитесь по процессу создания и запроса СортировкаTableMap. Мы начнем с создания памяти отображенного объема для хранения данных, а также раковины для добавления данных. На первом вызове нашего тома, мы будем устанавливать только для чтения флаг, чтобы ложные , гарантируя, что мы можем написать в том:

String VOLUME_LOCATION = "sortedTableMapVol.db";

Volume vol = MappedFileVol.FACTORY.makeVolume(VOLUME_LOCATION, false);

SortedTableMap.Sink sink =
  SortedTableMap.create(
    vol,
    Serializer.INTEGER,
    Serializer.STRING)
    .createFromSink();

Далее мы добавим наши данные и вызовем создать метод на раковине, чтобы создать нашу карту:

for(int i = 0; i < 100; i++){
  sink.put(i, "Value " + Integer.toString(i));
}

sink.create();

Теперь, когда наша карта существует, мы можем определить только для чтения тома и открыть нашу карту с помощью Открытый открытый метод:

Volume openVol = MappedFileVol.FACTORY.makeVolume(VOLUME_LOCATION, true);

SortedTableMap sortedTableMap = SortedTableMap
  .open(
    openVol,
    Serializer.INTEGER,
    Serializer.STRING);

assertEquals(100, sortedTableMap.size());

4.1. Двоичный поиск

Прежде чем двигаться дальше, давайте поймем, как СортировкаTableMap использует двоичный поиск более подробно.

СортировкаTableMap делит хранилище на страницы, при этом каждая страница содержит несколько узлов, состоящих из ключей и значений. В этих узлах находятся пары ключевых значений, которые мы определяем в нашем Java-коде.

СортировкаTableMap выполняет три двоичных поиска, чтобы получить правильное значение:

  1. Ключи для каждой страницы хранятся на куче в массиве. СортировкаTableMap выполняет двоичный поиск, чтобы найти правильную страницу.
  2. Далее происходит декомпрессия для каждого ключа в узел. Двоичный поиск устанавливает правильный узел, согласно клавишам.
  3. Наконец, СортировкаTableMap поиск ключей в узлах, чтобы найти правильное значение.

5. Режим памяти

MapDB предлагает три типа магазина памяти. Давайте кратко рассмотрим каждый режим, поймем, как он работает, и изумим его преимущества.

5.1. На куче

Режим на куче хранит объекты в простом java Collection Карта . Это не использует сериализацию и может быть очень быстрым для небольших наборов данных.

Однако, поскольку данные хранятся на куче, набор данных управляется сбором мусора (GC). Продолжительность GC возрастает вместе с размером набора данных, что приводит к снижению производительности.

Рассмотрим пример, указывающий режим на куче:

DB db = DBMaker.heapDB().make();

5.2. Byte

Второй тип магазина основан на массивах карт. В этом режиме данные сериализируются и хранятся в массивах размером до 1 МБ. Хотя технически на кучу, этот метод является более эффективным для сбора мусора.

Это рекомендуется по умолчанию, и был использован в нашем примере ‘Hello Baeldung’:

DB db = DBMaker.memoryDB().make();

5.3. ПрямойБайтБуффер

Окончательный магазин основан на ПрямойБайтБуффер. Прямая память, введенная в Java 1.4, позволяет передавать данные непосредственно в родную память, а не в Java-кучу. В результате данные будут храниться полностью вне кучи.

Мы можем вызвать магазин этого типа с:

DB db = DBMaker.memoryDirectDB().make();

6. Почему MapDB?

Итак, зачем использовать MapDB?

6.1. MapDB против традиционной базы данных

MapDB предлагает большой массив функциональности базы данных, настроенный всего с несколькими строками Java-кода. Когда мы используем MapDB, мы можем избежать часто трудоемкой настройки различных служб и соединений, необходимых для заставить нашу программу работать.

Помимо этого, MapDB позволяет нам получить доступ к сложности базы данных со знакомой коллекции Java. С MapDB нам не нужен S’L, и мы можем получить доступ к записям с помощью простых получить метод вызовов.

6.2. MapDB против простых коллекций Java

Java Collections не будет сохранять данные нашего приложения, как только оно перестанет выполняться. MapDB предлагает простой, гибкий, подключенный сервис, который позволяет нам быстро и легко сохранять данные в нашем приложении, сохраняя при этом полезность типов сбора Java.

7. Заключение

В этой статье мы глубоко погружены во встроенный движок базы данных и систему сбора данных MapDB.

Мы начали с того, что смотрели на основные классы DB и DBMaker настроить, открыть и управлять нашей базой данных. Затем мы обошли несколько примеров структур данных, которые MapDB предлагает работать с нашими записями. Наконец, мы рассмотрели преимущества MapDB перед традиционной базой данных или Java Collection.

Как всегда, пример кода доступен более на GitHub .