Какова наилучшая стратегия базы данных для JRuby on Rails + устаревший код Java?

У нас есть Java-приложение среднего размера, которое нуждается в некотором рефакторинге.

Мы рассматриваем возможность перехода на JRuby on Rails. В основном из-за производительности, которую предлагает Ruby on Rails, и из-за множества существующих плагинов, которые будут заново реализовывать веб-логику.

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

Ключевым моментом нашего рефакторинга является очистка нашего управления базой данных, которое в настоящее время представляет собой сочетание закодированных вручную операций SQL и некоторых объектов, хранящихся в db4o.

Из JRuby мы можем вызвать любой устаревший код Java. Здорово!

Однако многие плагины Ruby on Rails предполагают использование ActiveRecord для управления базой данных. Доступ к данным ActiveRecord из Java кажется нетривиальным.

Какая стратегия лучше всего подходит для управления базой данных между JRuby on Rails и устаревшим кодом Java?

  • Мы могли бы использовать db4o для всего, но потеряли бы преимущества некоторых плагинов Ruby on Rails и должны были бы управлять объектами «вручную» на стороне Ruby.
  • Мы могли бы использовать ActiveRecord для всего и определить какое-то избыточное отображение на стороне Java. Какая стратегия будет лучшей?
  • Мы будем использовать технологию Java ORM (Hibernate, Cayenne?), а затем отобразить модель в ActiveRecord. Чем эта идея отличается от предыдущей?
  • Можем ли мы сотворить немного волшебства, используя Jruby 1.4, bet_java!?

Что вы думаете?


person rodrigob    schedule 26.01.2010    source источник
comment
+1, чертовски хороший вопрос: я не удивлюсь, если в ближайшем будущем увижу гораздо больше именно такого рода деятельности.   -  person Roboprog    schedule 26.01.2010


Ответы (4)


JRuby — отличный язык, но на самом деле это Ruby, работающий на виртуальной машине Java. Можно интегрировать устаревший код Java, но он плохо вписывается в основной язык.

Если вас интересует новый динамический язык с надежной веб-платформой, я бы посоветовал обратить внимание на Groovy и http://grails.org/. Groovy построен на JVM. Унаследованные классы могут быть первоклассными в приложении. Я думаю, что было бы намного проще перейти на что-то новое, потому что вы можете повторно использовать то, что у вас есть, переписывая нужные вам части.

person Chris Dail    schedule 26.01.2010
comment
Я уже пытался использовать Grails для решения своей проблемы, и он с треском провалился, чтобы сделать то, что мне нужно (у меня был плохой пользовательский опыт, когда я пытался запустить фиктивную демонстрацию с помощью плагина Wicket). Если я собираюсь использовать что-то вроде рельсов, я бы предпочел использовать настоящие рельсы. Мне не нужна идеальная интеграция jurby on rails ‹-› унаследованной Java. Мне просто нужно, чтобы это было достаточно хорошо. - person rodrigob; 26.01.2010

Похоже, вы планируете провести небольшой рефакторинг на стороне Java в дополнение к написанию нового кода на Ruby. В таком случае я бы рекомендовал:

1) выберите Java ORM: Hibernate или db4o и используйте его во всех ваших рефакторингах Java. Как бы я ни хотел сказать, используйте ActiveRecord для всего, суть в том, что будет намного проще убедить JRuby работать с Java ORM, чем заставить ваш Java-код работать с объектами ActiveRecord. .

2) Есть как минимум прототипы-примеры интерфейсов Ruby как для Hibernate, так и для db4o. Найдите один для начала работы, а затем добавьте к нему необходимые возможности ORM.

3) Не беспокойтесь о плагинах Rails, которые ожидают ActiveRecord. Не все это делают, и еще меньше будет в будущем, поскольку Rails 3 (слияние Rails и Merb) отделяет ActiveRecord. И даже если есть обязательный плагин, который требует ActiveRecord, ну и что? Это просто код Руби. Загрузите его, посмотрите, что он ожидает, и создайте класс фасада для вашего ORM, чтобы предоставить методы, которые нужны плагину. (Здесь мы видим красоту Ruby — объекту не обязательно быть уткой, если он ходит и крякает, как уточка). В качестве альтернативы вы можете пропатчить подключаемый модуль, чтобы удалить зависимость от ActiveRecord, или просто реализовать функциональность, предоставляемую подключаемым модулем, самостоятельно. Ваша ситуация, вероятно, диктует, какой из этих подходов имеет смысл.

person paulbonner    schedule 26.01.2010

Трудно ответить на этот вопрос, не зная многих деталей.

Во-первых, вполне возможно создавать приложения Rails без использования ActiveRecord (AR). Я сделал несколько - обычно я использую контроллер для запуска скриптов, чтения/записи файлов и т. д., и я считаю, что этот подход действителен. Однако, поскольку у вас определенно есть данные в базе данных, с которыми нужно работать, помните о подходе MVC, независимо от того, является ли ваш M AR или нет.

Если ваша БД хорошо спроектирована, у вас может быть гибридный подход. Например, возможно, ваша устаревшая Java генерирует отчетные данные с помощью любого ORM и записывает их в БД, таблицы из которой затем можно легко обернуть в модели ActiveRecord для отображения отчета через ваше приложение Rails. Все зависит от того, какие функции выполняет ваш код Java по сравнению с тем, какие функции выполняет ваш код Rails (и опять же, если ваш дизайн БД поддается моделированию AR).

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

Я предлагаю подход «попробуй и увидишь». Попробуйте несколько вещей и посмотрите, как быстро вы столкнетесь с проблемами. В таких случаях я чувствую, что попытки сначала спроектировать все это в уме не так уж продуктивны.

person Robert Brown    schedule 28.01.2010

К вашему сведению: в книге O'Reilly "Enterprise Rails" есть несколько полезных советов по созданию собственных плагинов для Rails, чтобы вы могли находить/поддерживать/повторно использовать любые приемы, которые придумаете. Дикая догадка: сделать плагин O/R, который вы можете при желании использовать, чтобы сидеть поверх устаревшего кода Java?

В качестве альтернативы создайте немного магии в базе данных, чтобы старый java мог волшебным образом считывать результаты из «новых и улучшенных!» рубиновая обработка?!? Я предполагаю, что БД с представлениями, триггерами и доступом для их использования.

Удачи, у меня действительно нет хорошего ответа, но мне очень интересно, как это работает для вас.

person Roboprog    schedule 26.01.2010