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

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

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

10 ответов

Вы должны обязательно попробовать JDBM2, он делает то, что вы хотите:

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

К тому же:

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

ОБНОВИТЬ

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

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

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

Плюс оба абсолютно бесплатны.

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

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

--- отредактировано после просмотра размера файла ---

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

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

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

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

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

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

https://github.com/akiban/persistit

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

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

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

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

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

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

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

H2 http://www.h2database.com/

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

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