JCR против JPA для DMS: производительность, преимущества, недостатки

После изучения информации о JCR или СУБД и чтение других сообщений, я все еще не уверен, следует ли использовать JCR вместо JPA для системы управления документами, которая должна иметь дело с различными типами документов, очень большими файлами и многом. > одновременного доступа многих пользователей.

Моя главная причина рассмотреть JCR заключается в том, что документы для меня выглядят как содержимое, а спецификация уже имеет дело с некоторыми проблемами, которые возникают с этим — в основном меня интересуют хранение и управление версиями. Также я хотел бы как бы инкапсулировать материал документа в реализацию JCR и использовать JPA для всего остального, специфичного для приложения.

Может быть, кто-то может помочь мне с моими оставшимися вопросами:

  • Как производительность чтения/запроса JCR связана с JPA (я знаю, что она должна сильно различаться в зависимости от реализации, но могут быть некоторые эмпирические правила)?
  • Есть ли у кого-нибудь реальный опыт аналогичного использования с некоторыми конкретными реализациями JCR? Если да, то смешивали ли вы его с реляционной базой данных (JPA)?
  • Стоит ли вводить JCR, учитывая преимущества файлового хранилища и управления версиями? (Вероятно, я перейду к своему собственному пользовательскому управлению доступом (JPA), и мне не понадобится дополнительная гибкость для введения новых свойств узла во время выполнения)
  • Есть ли у кого-нибудь опыт в области решений для обеспечения целостности данных и резервного копирования?

ОБНОВЛЕНИЕ: несмотря на то, что на этот вопрос был дан подробный ответ, у кого-то может быть более критическое мнение о его использовании с более практической точки зрения. Лично меня все больше и больше беспокоят следующие вопросы, не связанные с техникой:

  1. Документация: у Jackrabbit плохая документация, его руководство по OCM содержит мертвый ссылка в первом абзаце, некоторые примеры поисковых запросов вызывают исключения по неизвестным причинам, есть ссылка TODO в очень простом руководстве, и его автономный сервер не работает должным образом в JDK8, который вообще не задокументирован.
  2. Зрелость: Jackrabbit Oak, похоже, все еще находится в стадии разработки, а другие решения выглядят либо заброшенными, либо передовыми.
  3. Сообщество: В отличие от JPA, исследование JCR приводит к гораздо меньшему количеству хитов. Это может стать настоящей проблемой, когда проектная группа, плохо знакомая с технологией, застревает в (тривиальных) проблемах.

person Journeycorner    schedule 12.06.2015    source источник


Ответы (1)


Краткая версия: Документы представляют собой структурированное или полуструктурированное содержимое. Это вариант использования иерархически организованного хранилища данных. Вы должны пойти на JCR, если вы не хотите реализовывать все основные вещи dms/cms для себя (учтите это, вы, вероятно, делаете это в первый раз, в то время как они делали это все время).

Длинная версия: JCR охватывает большую часть основных вариантов использования систем управления документами или контентом по спецификациям, таким как управление версиями, блокировка, управление жизненным циклом или ссылочная целостность. Кроме того, это позволяет вам расширять ваши данные без изменения схемы (конечно, вы можете определить свои типы узлов в модели, но это не обязательно). Большинство реализаций JCR (например, Jackrabbit) используют базу данных в бэкэнде, что делает их «немного больше», чем слой абстракции над вашим реляционным бэкендом. Для работы с большими данными вы можете использовать хранилище файловой системы (что намного быстрее, чем хранение всех двоичных данных в базе данных) при сохранении структурированных данных (узлов и свойств) в базе данных.

При переходе на JPA вам придется иметь дело со всеми этими вещами dms/cms самостоятельно. Конечно, вы можете это сделать, но это гораздо более низкоуровневое программирование, которое уже было сделано в реализации JCR. Каждое изменение модели требует изменения схемы, а макет таблицы не так тривиален (вы хотите иметь большую таблицу для ваших документов, где каждое свойство является столбцом? вы хотите иметь отдельную таблицу для каждого класса документов? как вы моделируете жизненные циклы, как вы моделируете управление версиями?)

Для первых прыжков с JCR я бы рекомендовал Модель Дэвида, считайте все ваше приложение контентом . Я работал в проекте, где мы отказались от сочетания JCR и JPA, чтобы нам не приходилось иметь дело с разными API для хранения.

И есть по крайней мере несколько реализаций JCR.

  • Jackrabbit 2 (Эталонная реализация, оптимизированная для операций чтения, в настоящее время находится в режиме обслуживания)
  • Jackrabbit OAK (нацелен на высокомасштабируемые репозитории контента с балансировкой производительности чтения/записи. Он принадлежит той же основной команде, что и Jackrabbit)
  • Jackrabbit FileVault (бэкенд исключительно в файловой системе)
  • Modeshape (альтернативная реализация, быстрая и масштабируемая, с REST API, довольно хорошая документация)

Кстати. JCR API и реализации в значительной степени сделаны с учетом архитектуры RESTful. Поэтому, если вы рассматриваете REST API, сопоставление тоже довольно простое. Кроме того, это позволяет потребителю исследовать контент напрямую через JCR API, что упрощает интеграцию контента в другие приложения (т.е. только для чтения), в то время как вам нужно раскрыть внутреннюю структуру вашей базы данных с помощью JPA, что повышает вероятность нарушения потребительских контрактов. на изменения.

По оставшимся вопросам:

  • У меня нет сравнительных диаграмм, и, как обычно, это зависит от структуры данных и индексов, а также от дизайна вашего запроса. Реализации JCR имеют встроенное кэширование, и вы обычно перебираете наборы результатов. Таким образом, нет общего утверждения о том, что быстрее/медленнее, все зависит от варианта использования.
  • Я сделал нечто подобное, и мы остались довольны реализацией Jackrabbit, но мы были на JDK7. У нас были все данные (включая пользовательские настройки, настройки приложения и т. д.) в репозитории и вообще не сохранялись JPA. Также доступно сопоставление содержимого объектов, если оно вам нужно.
  • Да, стоит представить. В Jackrabbit есть собственное управление пользователями — вам не нужно реализовывать его самостоятельно. А управление доступом доступно через JCR API и JAAS. Хотя я рекомендую не использовать JCA ResourceAdapter для администрирования управления пользователями и контроля доступа, так как он не предоставляет API Jackrabbit.
  • Вопрос о целостности данных и резервном копировании не является особенным для JCR или JPA, оба обеспечивают целостность на некотором уровне (целостность базы данных, JCR выполняет ссылочную целостность), и оба могут быть скопированы (резервное копирование db, резервное копирование fs). И оба являются стандартизированным способом доступа к данным, так что вы даже можете создать свою собственную логику резервного копирования.
person Gerald Mücke    schedule 15.06.2015
comment
Хорошие моменты, особенно Модель Давида была очень полезной, спасибо! Я обновил свой вопрос, чтобы охватить оставшиеся проблемы. - person Journeycorner; 16.06.2015
comment
Поэтому нет общего утверждения относительно скорости/медленности: после нескольких лет работы с Jackrabbit я могу с уверенностью сделать общее заявление о том, что у Jackrabbit серьезные проблемы с производительностью при работе с чем угодно, кроме наборов данных игрушечного размера. - person Adrian Baker; 26.07.2017