Простой способ хранить и извлекать объекты на Java без использования реляционной БД?

Знаете ли вы «простой» способ хранения и извлечения объектов в Java без использования реляционной базы данных / ORM, такой как Hibernate?

[Обратите внимание, что я не рассматриваю сериализацию как есть для этой цели, поскольку она не позволяет извлекать произвольные объекты в середине графа объектов. Я также не рассматриваю DB4O из-за его ограничительной лицензии. Спасибо.]

«Легкое» значение: отсутствие необходимости обрабатывать низкоуровневые детали, такие как пары ключ / значение, для восстановления графа объекта (как в случае с BerkeleyDB или традиционными кэшами). То же самое относится к перестроению объектов из БД, ориентированной на документы или столбцы (CouchDB, HBase, ..., даже Lucene).

Возможно, существуют интересные проекты, обеспечивающие уровень интеграции между упомянутыми системами хранения и объектной моделью (например, ORM для СУБД), о которых я не знаю.

Кто-нибудь успешно использует их в производстве или экспериментирует со стратегиями сохранения, отличными от реляционных БД? Как насчет RDF-магазинов?

Обновление: мне попалась очень интересная статья: Список распределенных хранилищ ключей и значений


person Community    schedule 14.01.2009    source источник
comment
Может быть, вам стоит перефразировать свой вопрос на что-то вроде простого способа хранения и извлечения объектов на Java без использования реляционной базы данных, сериализации объектов или какого-либо продукта под лицензией GPL ?. Кстати, мне было бы интересно узнать о таком решении.   -  person Fabian Steeg    schedule 14.01.2009
comment
спасибо, но я думаю, что это название будет слишком длинным!   -  person    schedule 14.01.2009
comment
Я согласен. Я вижу здесь 2 варианта: писать в файловую систему напрямую (сериализация) или использовать базу данных. Вы не хотите ничего из этого? Или вы хотите что-то вроде DB40, но с менее жесткой лицензией?   -  person Outlaw Programmer    schedule 14.01.2009
comment
Я не понимаю вашего возражения против сериализации. Вы можете сериализовать карты, иметь карты для сериализованных объектов и т. Д.   -  person Tom Hawtin - tackline    schedule 14.01.2009
comment
@Tom: может быть, я был недостаточно ясен. Я имею в виду, что если я сериализую, то есть объект зоопарка, содержащий 5 животных, как я могу получить / десериализовать любое данное животное независимо? понимаете?   -  person    schedule 14.01.2009


Ответы (9)


  • Сериализация объектов (также известная как сохранение данных в файл)
  • Hibernate (использует реляционную базу данных, но она довольно прозрачна для разработчика)

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

person Matt Campbell    schedule 14.01.2009
comment
спасибо за ответ, но я только что сказал, что не хочу использовать БД! это подразумевает, что я не использую ORM ... я ищу альтернативные вещи. также, как я сказал в сообщении, никакой сериализации !!! - person ; 14.01.2009

NeoDatis выглядит интересно. Он лицензирован под LGPL, поэтому не так строг, как собственно GLP.

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

person Steve K    schedule 14.01.2009
comment
спасибо, Стив. Я на самом деле довольно хорошо знаю neodatis (я даже написал интеграцию warp-persist-neodatis) - я просто перестал его использовать, потому что он был действительно глючным, но я должен попробовать еще раз. блин, я думаю, я здесь слишком требователен ... :) - person ; 14.01.2009
comment
Были ли вы очень вовлечены в проект NeoDatis? Большинство проектов с открытым исходным кодом, с которыми я работал, довольно быстро реагируют на отчеты об ошибках / исправления. Я не был связан с NeoDatis - так что они могут быть исключением :) - person Steve K; 15.01.2009
comment
да, этот парень очень отзывчивый. но он один, и проблема в том, что у меня все время возникают проблемы - так что я не уверен в стабильности. я собираюсь проверить еще раз :) и взглянуть на исходный код - person ; 15.01.2009

Я хотел бы порекомендовать XStream, который просто берет ваши POJO и создает из них XML, чтобы вы могли хранить его на диск. Он очень прост в использовании, а также имеет открытый исходный код.

person willcodejavaforfood    schedule 14.01.2009

Я бы порекомендовал Hibernate (или, в более общем смысле, OR-отображение), например Мэтт, но на бэкэнде также есть СУБД, и я не уверен, что вы имеете в виду под

... без использования реляционной БД? ...

Также было бы интересно узнать больше о приложении, потому что OR-отображение не всегда является хорошей идеей (производительность разработки или производительность во время выполнения).

Изменить: я вскоре узнал о терракоте, и здесь есть хорошее обсуждение stackoverflow здесь о замене БД этим инструментом. Все еще экспериментальный, но стоит прочитать.

person Kai Huppmann    schedule 14.01.2009
comment
благодаря. я имел в виду убрать из картины РСУБД и ORM - person ; 14.01.2009

Я по-прежнему считаю, что вам стоит подумать об оплате db4o.

Если вам нужно что-то еще, добавьте к заголовку «с лицензией в стиле MIT».

person orip    schedule 14.01.2009
comment
я так не думаю. Спасибо за ваш комментарий - person ; 14.01.2009

Просмотрите комментарии к Prevayler по этому вопросу. Prevayler - это транзакционная оболочка для сериализации объектов - грубо говоря, используйте объекты в простой java и сохраняйте на диске через java API без sql, что немного удобнее, чем писать собственную сериализацию.

Предостережения: с сериализацией как механизмом устойчивости вы рискуете сделать ваши сохраненные данные недействительными при обновлении класса. Даже с библиотекой-оболочкой вы, вероятно, захотите настроить обработку сериализации / десериализации. Это также помогает включить serialVersionUID в класс, чтобы вы переопределили представление JVM о том, когда класс обновляется (и, следовательно, не можете перезагрузить сохраненные сериализованные данные).

person Steve B.    schedule 14.01.2009

Хм ... без сериализации и без решения ORM я бы вернулся к какой-то реализации на основе XML? Вам все равно придется тщательно спроектировать его, если вы хотите извлечь только некоторые объекты из графа объектов - возможно, отдельный файл для каждого объекта, где отношения объектов ссылаются на URI с другим файлом?

Я бы сказал, что это было непросто, потому что проектирование сопоставления XML с объектами всегда занимало много времени, но меня действительно вдохновил разговор об Apache Betwixt, который вселил у меня надежду, что я просто устарели, и теперь доступны более простые решения.

person bethlakshmi    schedule 14.01.2009
comment
Разве это не просто сериализация? - person Outlaw Programmer; 14.01.2009

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

Терракота:

  • не нарушает идентичность объекта, обеспечивая наиболее естественный интерфейс программирования
  • не требует сериализации
  • кластеры (и сохраняется) почти все классы Java (Карты, Блокировки, Очереди, FutureTask, CyclicBarrier и др.)
  • сохраняет объекты на диск со скоростью памяти
  • перемещает только дельты объектов, обеспечивая очень высокую производительность

Вот пример того, как gnip использует Terracotta для сохранения в памяти. - нет базы данных. Gnip принимает все события в Facebook, Twitter и т. Д. И предоставляет их потребителям в стандартизированном виде. Их текущее решение обрабатывает более 50 000 сообщений в секунду.

Это OSS и имеет высокую степень интеграции со многими другими сторонними фреймворками, включая Spring и Hibernate.

person Taylor Gautier    schedule 17.02.2009

Думаю, я нашел своего рода ответ на свой вопрос.

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

CouchDB, похоже, отвечает всем требованиям. Он по-прежнему может действовать как хранилище ключей и значений, но его отличные возможности запросов (отображение / сокращение, сопоставление просмотра), готовность к параллелизму и независимый от языка HTTP-доступ делают его моим выбором.

Единственная проблема заключается в том, чтобы правильно определять и сопоставлять структуры JSON с объектами, но я уверен, что придумаю простое решение для использования с реляционными моделями из Java и Scala (и позже буду беспокоиться о кешировании, поскольку конкуренция уходит от база данных). Терракотовый цвет все еще может быть полезен, но, конечно, не так, как в сценарии РСУБД.

Спасибо всем за ваш вклад.

person Community    schedule 01.03.2009