Какова цель Spring Data и его уровень абстракции?

Пытаясь понять цель «Spring Data», я наткнулся на эту статью и попробовал несколько примеров с репозиториями Gemfire/Redis и их соответствующими компонентами Spring-Data. Может ли кто-нибудь помочь мне со следующими вопросами.

Сценарий. Когда GemFire ​​был моим хранилищем данных, мне приходилось использовать методы create, get и remove в GemFireTemplate для выполнять CRUD-операции. Когда Redis был моим хранилищем данных, мне приходилось использовать методы .opsForHash().put , .opsForHash().get и .opsForHash().delete в RedisTemplate для выполнения те же CRUD-операции.

Вопрос:

Разве Spring-Data не должен обеспечивать уровень абстракции базового хранилища данных? Если я должен знать соответствующие методы CRUD и иметь разные API-интерфейсы на основе базового хранилища данных, какую абстракцию привносят компоненты Spring-Data? Могу ли я напрямую использовать клиент Jedis или Java для Gemfire для выполнения этих операций CRUD, специфичных для хранилища данных?

Эта ссылка, кажется, объясняет это, но, похоже, мне нужна помощь в понимании этого .

не существует общего API для всех хранилищ сохраняемости. Различия слишком принципиальны. Но проект Spring Data предоставляет общую модель программирования для доступа к вашим данным


person yathirigan    schedule 10.03.2015    source источник


Ответы (3)


Данные Spring действительно обеспечивают уровень абстракции базового хранилища данных. Тем не менее, хранилища NoSQL представляют собой очень разнообразный спектр, одно представляет собой графовую базу данных, другое специализировано для хранения документов, третье — для хранения пар ключ-значение и т. д. Тем не менее, это не те различия, которые вы хотите абстрагироваться, это уникальная особенность, которая заставила вас выбрать их в первую очередь.

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

  • Это дает вам согласованный способ настройки ресурсов для доступа к магазинам.
  • Отображение и преобразование между базовыми типами и типами Java
  • Абстракция репозитория для большинства хранилищ, которая сводится только к объявлению интерфейса для базовой операции CRUD. Реализация и специфичные для магазина вещи обрабатываются Spring Data.
  • Выделенная реализация шаблона, обеспечивающая обратные вызовы для доступа к собственным API.

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

person Master Slave    schedule 10.03.2015
comment
Q1. ›› это не те различия, которые вы хотите абстрагировать ‹‹ - Разве у них не было бы абстракции, по крайней мере, среди хранилищ данных общего типа. например И Redis, и Gemfire являются хранилищами Key-Value, но похоже, что для них нет CRUDRepositories, вместо этого мне приходится использовать шаблоны для прямого доступа только к их соответствующим собственным API, что лишает цели перехода к Spring-данным этих репозиториев. - person yathirigan; 10.03.2015
comment
Я считаю, что CRUDRepositories служат этой цели, это правильно? - person yathirigan; 10.03.2015
comment
именно, CRUDRespository является общим уровнем абстракции, и на его основе вы получите согласованный интерфейс работы CRUD как для GemFire, так и для Redis. - person Master Slave; 10.03.2015
comment
›› последовательный способ настройки ресурсов ‹‹ и ›› сопоставление и преобразование ‹‹, если вы не возражаете, не могли бы вы пролить больше света на эту или любую статью, объясняющую это. Я ищу статью, в которой есть сравнение того, какой код/конфигурацию мне пришлось бы написать, если бы не было пружинных данных, и как код/конфигурация упрощается с использованием пружинных данных.. - person yathirigan; 10.03.2015
comment
См. эту статью для реализации GemFire ​​spring.io/guides/gs/accessing-data-gemfire, благодаря Spring Data вы можете добиться того же в магазине Redis с минимальными переписываниями кода. - person Master Slave; 10.03.2015

Спасибо за ваш вопрос, поскольку Master Slave уже хорошо указал, что преимущества, предоставляемые Spring Data, многообразны, но иногда между модулями хранилища существуют функциональные различия в смысле поддерживаемых функций. Это частично мотивировано различными характеристиками и возможностями конкретного базового хранилища данных, а также ограничениями по фокусу и времени.

Redis и Gemfire в некоторой степени расширяют аналогичные технологии хранения, предоставляя модель хранения и доступа по принципу «ключ-значение». Однако Gemfire предоставляет гораздо более широкие возможности запросов, чем Redis. Это одна из причин, по которой Spring Data Gemfire уже имеет Абстракция репозитория уже давно.

С другой стороны, Redis — это совсем другая история. Как уже упоминалось в Master Slave, вы можете легко создать свой собственный настраиваемый репозиторий Redis — и это то, что делают многие люди — но обычно взаимодействие с Redis совершенно уникально для случая использования, поэтому мы не не вижу такого большого функционального совпадения, чтобы мотивировать общую реализацию, которая делает больше, чем просто «сохраняет» и «загружает».

У нас есть заявка на добавление абстракции репозитория в Spring Data Redis, но у нас не было время еще делать.

person Thomas Darimont    schedule 10.03.2015
comment
спасибо за дополнительные подробности, а также за указание на абстракцию репозитория Gemfire. Я буду смотреть в него. - person yathirigan; 16.03.2015

Некоторые дополнительные мысли по теме...

Одно из многих преимуществ использования шаблонов Spring для доступа к конкретному хранилищу данных (например, GemfireTemplate) заключается в том, что они защищают разработчиков от основных изменений API хранилища данных, вокруг которых обычно оборачивают шаблоны. Если поставщик хранилища данных вносит критические изменения в интерфейс API (как это было в случае с GemFire), тогда шаблон может обеспечить уровень абстракции/адаптации к базовому API без изменений в пользовательском приложении.

Кроме того, шаблон может использовать другие средства управления инфраструктурой Spring, такие как транзакции, которые обычно не встроены в базовые API-интерфейсы хранилища данных. Шаблоны также могут обеспечивать внешний вид и уровень удобства для нескольких различных API-интерфейсов в базовом продукте хранилища данных.

Например, GemfireTemplate инкапсулирует операции «получения» и «помещения» данных вместе с «запросом» интересующих данных.

Чтобы сделать первое в GemFire, вам нужно будет сделать следующее...

Region<String, SomeValue> example = gemfireCache.getRegion("/Example");

example.put("someKey", new SomeValue(..));
...
SomeValue someValue = example.get("someKey");

В то время как для запроса данных в «/Example» вы бы...

Region<String, SomeValue> example = gemfireCache.getRegion("/Example");
QueryService queryService = example.getQueryService();
Query query = queryService.newQuery("SELECT * FROM /Example WHERE ...");
Object result = query.execute(<any args for query parameters>);

if (result instanceof SelectResults) {
  SelectResults<SomeValue> someValues = (SelectResults) result;
  // process the query results
}
else {
  // figure out what happened
}

Теперь сравните это с шаблоном Spring для получения/ввода данных.

gemfireTemplate.put("someKey", new SomeValue(..));
...
SomeValue someValule = gemfireTemplate.get("someKey");

И запрос...

SelectResults<SomeValue> results = gemfireTemplate.find("SELECT * FROM /Example WHERE ...", args);

// process the query results

Если возникает Исключение или результаты не могут быть собраны, то Исключения/Ошибки GemFires единообразно сопоставляются с основная иерархия исключений DAO Spring Framework, еще одно преимущество, которое упрощает переключение базовых хранилищ данных, а также обеспечивает согласованную обработку транзакций.

Наконец, в то время как Томас Даримонт и Master Slave прекрасно резюмировали преимущества использования абстракция Spring Data Repository, это не новая концепция.

До появления выразительной мощности и удобства абстракции репозитория Spring Data разработчики приложений использовали шаблон DAO для абстрагирования CRUD и других операций доступа к данным (например, запросов) из своего уровня служб приложений.

Однако Spring Data дает вам возможность сделать это, просто объявив контракт (интерфейс Java) для разрешенных операций доступа к данным, а Spring Data (включая реализации для конкретного поставщика, такие как Spring Data GemFire) позаботится обо всем остальном. подключение конкретной реализации хранилища данных "по умолчанию", которая очень настраиваемые.

Очевидно, я предвзят, но выражать запрос, используя имя метода интерфейса, используя параметры метода в качестве аргументов запроса SQL/OQL/и т. д., это просто чертовски круто и мощно.

Если запросы не слишком сложные или специфичные, их можно легко перенести из одного хранилища данных в другое, даже между отношением и хранилищем ключей/значений (например, GemFire, учитывая сходство между SQL и OQL).

Надеюсь это поможет. Ваше здоровье!

person John Blum    schedule 10.03.2015
comment
это было очень полезно, особенно сравнение кода между шаблонами, с использованием и без использования шаблонов ... так что, если я правильно понял из предыдущего ответа. В идеале CRUDOperations в SpringData обеспечивает абстракцию, и мы переходим к шаблонам для доступа к дополнительным базовым API. На высоком уровне, могу ли я резюмировать это? - person yathirigan; 16.03.2015