MapDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:09, 21 января 2019.
MapDB
fraimed
Разработчики: Jan Kotek
Выпущена: 2013; 6 years ago (2013)
Постоянный выпуск: 3.0.6 / 16 May 2018 года; 17 months ago (2018-05-16)
Предыдущий выпуск: 3.0.5 / 8 July 2017 года; 2 years ago (2017-07-08)
Состояние разработки: Активное
Написана на: Kotlin
Операционная система: Unix
Тип ПО: СУБД
Лицензия: Apache License 2.0
Веб-сайт MapDB

MapDB - гибкая и интуитивно понятная СУБД с открытым исходным кодом, распространяемая под лицензией Apache 2.0. По сути является гибридом между Java Collection Framework (JCF) и встраиваемой СУБД.

История

DBM (Database Manager) был простым механизмом базы данных, написанным Кеном Томпсоном для UNIX - в основном хеш-таблицей на диске. Проект JDBM (Java-порт) был запущен примерно в 2000 году группой разработчиков, с выпуском JDBM 1.0 в 2005 году.

Ян Котек работал над астрономическими вычислениями. В 2010 году он провел несколько недель, выполняя астрономические наблюдения в отдаленном регионе в чилийских Андах, и, по стечению обстоятельств, у него был исходный код JDBM на его ноутбуке. Долгие дни (все астрономические мероприятия ночные), он начал изменять и улучшать JDBM. И, вскоре, выпустил JDBM2, впоследствии JDBM3. Эти библиотеки широко использовались многими компаниями.

Понимая потенциал полноценной, мощной и гибкой базы данных Java, основанной на собственных API, Ян переименовал проект в MapDB и оставил свою «дневную работу», чтобы полностью посвятить себя проекту в начале 2013 года. В ноябре 2013 года CodeFutures предоставил Яну в команде полный рабочий день, предоставив ему свободу и экономическую поддержку, необходимую для полного посвящения его усилиям созданию MapDB ведущей базы данных Java в мире.

Обзор

MapDB считается одной из самых быстрых баз данных на Java, производительность которой сопоставима с коллекциями java.util[Источник 1], и предоставляет возможность работы с такими вещами, как:

  • карты
  • наборы
  • списки
  • очереди
  • растровые изображения с запросами диапазона, сроком действия, сжатием, хранением и потоковой загрузкой
  • транзакции ACID
  • моментальные снимки (snapshots)
  • инкрементные резервные копии
  • и многое другое

Ключом к одному из плюсов MapDB, гибкости движка, является устройство его архитектуры (см. рисунок 1).

Рисунок 1 – Архитектура MapDB

  • Collection API. это знакомый API коллекций Java, который каждый разработчик Java использует для поддержания состояния приложения. Он имеет простое расширение, которое позволяет контролировать точные характеристики конкретной базы данных (включая ее внутренний формат или структуру записи).
  • Engine. Здесь контролируются записи для базы данных, включая их внутреннюю структуру, контроль параллелизма, транзакционную семантику.
  • Volume. Физический слой хранения (например, на диске или в памяти). MapDB имеет несколько стандартных реализаций, и их хватит для большинства проектов.

Преимущества

Рассмотрим преимущества MapDB:

  • Локальная обработка данных и фильтрация. MapDB имеет утилиты для обработки огромного количества данных в разумные сроки.
  • Интуитивный и гибкий API. Можно достичь больших результатов просто пользуясь уже готовыми функциями.
  • Открытый исходный код. Бесплатен, под лицензией Apache 2.0.

Недостатки

Рассмотрим недостатки MapDB:

  • Множество распределений по кучам по каждому запросу
  • Не масштабируется для более чем нескольких одновременных авторов.

Начало работы с MapDB

Рассмотрим несколько примеров работы с MapDB

Создание базы данных

Ранее уже был упомянут такой плюс MapDB как наличие интуитивного и гибкого API. К примеру, если нужна чистая база данных, без транзакционных возможностей - все, что нужно сделать, это добавить несколько методов построения для невероятно быстрой настройки, и код приложения вообще не нуждается в изменении:

// Инициализация базы данных MapDB внутри памяти без транзакций
DB database = DBMaker.newMemoryDB()
                .transactionDisable()
.closeOnJvmShutdown()
.make();
 
// Создание Map:
Map<String,String> newMap = database.getTreeMap(testmap);
 
// Работа с Map при помощи стандартного Map API.
newMap.put(firstkey, firstvalue);
newMap.put(secondkey, secondvalue);
 
String value = newMap.get(firstkey);
...

Возможность поиска

Допустим, нужно реализовать поиск объекта Person по имени пользователя или по числовому идентификатору. Это реализуется достаточно просто, можно создать объект Person и два Maps:

public class Person {
 
private Integer id;
private String name;
...
 
// Здесь сеттеры и геттеры
...
 
}
 
// Создание Map для Person по переменной name
Map<String,Person> personByNameMap = ...
 
// Создание Map для Person по переменной id
Map<Integer,Person> personByIDMap = ...

Принцип работы

Классы DBMaker и DB

MapDB легко подключается, так как существует два класса, которые действуют как "клей" между различными частями, а именно классы DBMaker и DB[Источник 2]. Класс DBMaker обрабатывает конфигурацию, создание и открытие базы данных. MapDB имеет несколько режимов и параметров конфигурации. Большинство из них могут быть установлены с использованием этого класса. DB в свою очередь представляет собой открытую базу данных (или сеанс одной транзакции). Он также может обрабатывать жизненный цикл базы данных такими методами, как:

  • commit ()
  • rollback ()
  • close ()

Чтобы открыть (или создать) хранилище, можно использовать один из многих статических методов *DB, таких как DBMaker.fileDB (). MapDB имеет больше форматов и режимов, в которых каждый xxxDB () использует разные режимы:

  • memoryDB () открывает базу данных в памяти, поддерживаемую массивом byte []
  • appendFileDB () открывает базу данных, которая использует файлы журнала только для приложений
  • и так далее

И, наконец, метод make (), который применяет все параметры, открывает выбранное хранилище и возвращает объект DB. К примеру, открытие хранилища файлов с включенным шифрованием:

DB db = DBMaker
        .fileDB("/some/file")
        //TODO encryption API
        //.encryptionEnable("password")
        .make();

После создания БД, рассмотрим пример открытия (или создания нового) TreeSet с именем 'example':

NavigableSet treeSet = db.treeSet("example").createOrOpen();

Можно применить дополнительную конфигурацию:

NavigableSet<String> treeSet = db
        .treeSet("treeSet")
        .maxNodeSize(112)
        .serializer(Serializer.STRING)
        .createOrOpen();

Вообще в конце могут быть разные методы:

  • create() создает новую коллекцию и бросает исключение, если коллекция уже существует
  • open() открывает существующую коллекцию и бросает исключение, если такой не существует
  • createOrOpen() открывает существующую коллекцию, или создает, если такой нет

Транзакции

У DB есть методы для управления жизненным циклом транзакции:

  • commit()
  • rollback()
  • close()

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

ConcurrentNavigableMap<Integer,String> map = db
        .treeMap("collectionName", Serializer.INTEGER, Serializer.STRING)
        .createOrOpen();

map.put(1,"one");
map.put(2,"two");
//map.keySet() is now [1,2] even before commit

db.commit();  //persist changes into disk

map.put(3,"three");
//map.keySet() is now [1,2,3]
db.rollback(); //revert recent changes
//map.keySet() is now [1,2]

db.close();

Источники

  1. Знакомство с MapDB // Gitbooks. [2014—2019]. Дата обновления: 20.01.2018. URL: https://jankotek.gitbooks.io/mapdb/content/ (дата обращения: 03.10.2018)
  2. Классы DBMaker и DB в MapDB // Gitbooks. [2014—2019]. Дата обновления: 20.01.2018. URL: https://jankotek.gitbooks.io/mapdb/content/db/ (дата обращения: 03.10.2018)