Однофайловое, постоянное, отсортированное хранилище ключей и значений для Java (альтернатива Berkeley DB)

Лицензирование Berkeley DB (JE) может стать препятствием для сделки. У меня есть приложение Java, предназначенное для небольшого круга клиентов, но, поскольку это настольное приложение, моя цена не может поддерживать лицензирование отдельных экземпляров.

Есть ли рекомендуемая альтернатива Java для Berkeley DB? Коммерческая или иная (хорошие реализации хранилища ключей и значений могут быть нетривиальными, я предпочитаю отложить обслуживание в другом месте). Мне нужно больше, чем просто хранилище хэшей, так как мне нужно будет перебирать последующие подмножества ключей, а базовые хранилища хэшей будут O (m * n) для поиска, и я ожидаю, что хранилище будет составлять ~ 50-60 ГБ на настольном компьютере. Дополнительная выгода: кто-нибудь, кого вы можете порекомендовать, хранит резервную копию в одном файле?


person Jé Queue    schedule 17.02.2011    source источник
comment
По какой причине это должен быть один файл размером 50-60 ГБ?   -  person corsiKa    schedule 17.02.2011
comment
Я знаю, это звучит странно, но это связано с ИТ-управлением настольных компьютеров и простым ограничением максимального размера диска для каждого узла. 1-3 файла - это нормально, но сохранение всего дерева каталогов или какой-либо другой структуры требует дополнительных затрат на управление для перестроения ноутбука и т. Д.   -  person Jé Queue    schedule 17.02.2011
comment
Berkeley DB JE имеет открытый исходный код. Вам не нужно никому платить за лицензию. oracle.com/technetwork/database/berkeleydb/downloads/   -  person JeremyP    schedule 17.02.2011
comment
двойная лицензия означает, что если вы покупаете его у оракула (с поддержкой и т. д.), вы должны что-то заплатить.   -  person Thomas Jungblut    schedule 17.02.2011
comment
@Thomas Jungblut - правильно, это будет покупаться, поддерживаться и распространяться, и поэтому такое лицензирование становится затруднительным в средах с множеством узлов.   -  person Jé Queue    schedule 18.02.2011
comment
@Xepoch, пожалуйста, свяжитесь со мной по адресу [email protected]. Я менеджер по продукту Berkeley DB, и я хотел бы помочь вам решить проблему лицензирования, если смогу.   -  person dsegleau    schedule 18.02.2011
comment
@dsegleau - спасибо. Письмо отправлено. Ваше здоровье.   -  person Jé Queue    schedule 18.02.2011


Ответы (10)


Обязательно попробуйте JDBM2, он делает то, что вам нужно:

  • Диск поддерживает HashMaps/TreeMaps, поэтому вы можете перебирать ключи.
  • Лицензия Апач 2

Кроме того:

  • Быстрый, очень компактный
  • Транзакционный
  • Отдельный jar весит всего 145 КБ.
  • Простое использование
  • Хорошо масштабируется до 1e9 записей
  • Использует сериализацию Java, без отображения ORM

ОБНОВЛЕНИЕ

Теперь проект превратился в MapDB http://www.mapdb.org.

person Andrejs    schedule 26.02.2012

Я думаю, что SQLite — это именно то, что вам нужно: бесплатно (общественное достояние), однофайловая база данных, нулевая конфигурация, небольшой размер. Footprint, Fast, cross-platform и т. д. Вот список оболочек, есть раздел для Java. Взгляните на sqlite4java и узнайте больше о Java + SQLite здесь.

person JPelletier    schedule 17.02.2011
comment
Нравится, но sqllite не на 100% Java, не так ли? - person Jé Queue; 17.02.2011
comment
Это C, но кроссплатформенный и имеет несколько оболочек Java. - person BlueRaja - Danny Pflughoeft; 17.02.2011
comment
@Xepoch, нет, это не 100% Java, как сказал BlueRaja, но со списком доступных оболочек Java это не должно быть проблемой. - person JPelletier; 17.02.2011

Это будет не один файл, но если вам нужна встроенная база данных, я предлагаю Java DB (переименованная версия Apache Derby, которую я использовал на предыдущей работе с прекрасным Результаты).

Кроме того, оба совершенно бесплатны.

Редактировать: чтение других комментариев, еще одно примечание: Java DB/Derby - это 100% Java.

person mdrg    schedule 17.02.2011
comment
Я опасаюсь вот что: когда рабочие столы/ноутбуки переизобразятся/заменятся (что, как я полагаю, происходит в среднем через ~10 месяцев, как ни странно), мне, вероятно, потребуется написать миграцию, чтобы извлечь данные из Java DB и повторно вставить. Могу ли я буквально просто взять резервные файлы Java DB в качестве копии, могу ли я сделать это по мере изменения версий JDK? - person Jé Queue; 17.02.2011
comment
@Xepoch Я сделал это на своей машине в качестве локальной резервной копии и в качестве теста, и это было простое копирование и замена, и БД была запущена и работала. Что касается JDK, я никогда не тестировал его, но, думаю, у вас не будет проблем, так как обратная совместимость всегда сохраняется. - person mdrg; 17.02.2011
comment
Я, конечно, думал об этом подходе. Я надеюсь, что двоичные данные совместимы с JavaDB вверх. Я должен начать еще один вопрос о JavaDB в Java7. - person Jé Queue; 18.02.2011

--- Отредактировал, увидев размер файла ---

Файлы размером от 50 до 60 ГиБ! Кажется, вам нужно знать, что ваш механизм БД не загружал все это в память сразу и был очень эффективен в обработке/очистке выгруженных блоков поддержки данных.

Я не знаю, справится ли Cloudscape с этой задачей, и не удивлюсь, если нет.

--- оригинальный пост следует ---

Cloudscape часто отвечает всем требованиям. Это немного больше, чем у Berkeley DB, но он получил достаточную поддержку, чтобы распространяться даже с некоторыми предложениями JDK.

person Edwin Buck    schedule 17.02.2011
comment
Я думал об этом, но мне нужно, чтобы группа поддержки настольных компьютеров могла перемещать хранилище/базу данных во время смены ноутбука. В противном случае мы каждый раз переносим данные рабочего стола. - person Jé Queue; 17.02.2011
comment
согласно редактированию, это правильно, мне не обязательно нужен кеш, так как большая часть данных будет передаваться из файла, и процент попаданий будет низким. - person Jé Queue; 17.02.2011

Рассмотрим ehcache. Я показываю здесь класс для его упаковки в виде java.util.Map. Вы можете легко хранить списки или другие структуры данных в качестве своих значений, избегая проблемы O (m * n), которая вас беспокоит. ehcache — это лицензия Apache 2.0 с коммерческой корпоративной версией, доступной Terracotta. Версия с открытым исходным кодом позволит вам сбрасывать ваш кеш на диск, и если вы решите не удалять записи кеша, это фактически будет постоянным хранилищем значений ключа.

person harschware    schedule 17.02.2011

JavaDB, он же Derby, он же Cloudscape, будет достойным выбором; это чистая база данных Java SQL, включенная в JRE, поэтому вам не нужно поставлять ее вместе с кодом или требовать от пользователей установки ее отдельно.

(На самом деле он не включен в JRE, предоставляемый некоторыми менеджерами пакетов Linux, но там это будет отдельный пакет, который легко установить)

Тем не менее, Дерби имеет довольно низкую производительность. Альтернативой может быть H2 — опять же, чистая база данных Java SQL, которая хранит базу данных в один файл размером около 1 МБ под распространяемой лицензией, но значительно быстрее и легче, чем Derby.

Я с удовольствием использовал H2 для ряда небольших проектов. JBoss настолько понравилось, что они встроили его в AS7. . Это тривиально настроить, и, безусловно, стоит попробовать.

person Tom Anderson    schedule 30.09.2012

Persistit — новый претендент. Это быстрая, постоянная и транзакционная библиотека Java B+Tree.

Боюсь, что нет никакой гарантии, что он все еще будет поддерживаться. Akiban, компания, поддерживающая Persistit, недавно была приобретена FoundationDB. Последний не предоставил никакой информации о будущем.

https://github.com/akiban/persistit

person Simon Brandhof - SonarSource    schedule 31.07.2013

Я просто хотел бы указать, что бэкенд хранилища H2 также может использоваться в качестве механизма хранения ключей и значений, если вам не нужен sql/jdbc:

http://www.h2database.com/html/mvstore.html

person mbelow    schedule 22.10.2015

H2 http://www.h2database.com/

Это полноценная база данных SQL/JDBC, но легкая и быстрая.

person Maurice Perry    schedule 18.03.2014

Взгляните на LMDBJava, привязки Java к LMDB, самое быстро отсортированное хранилище ключей и значений ACID.

person leventov    schedule 19.03.2017