В настоящее время мы оцениваем варианты перехода с рукописного уровня персистентности на ORM.
У нас есть несколько устаревших постоянных объектов (~ 200), которые реализуют простой интерфейс, подобный этому:
interface JDBC {
public long getId();
public void setId(long id);
public void retrieve();
public void setDataSource(DataSource ds);
}
Когда вызывается retrieve()
, объект заполняется сам, выполняя рукописные SQL-запросы к предоставленному соединению, используя идентификатор, полученный им в установщике (обычно это единственный параметр запроса). Он управляет своими утверждениями, результирующими наборами и т. Д. Сам. Некоторые из объектов имеют специальные разновидности метода retrive()
, например retrieveByName()
, в этом случае выдается другой SQL.
Запросы могут быть довольно сложными, мы часто объединяем несколько таблиц, чтобы заполнить наборы, представляющие отношения с другими объектами, иногда запросы на соединение выдаются по запросу в конкретном геттере (отложенная загрузка). Таким образом, в основном, мы реализовали большую часть функциональности ORM вручную.
Причиной тому было выступление. У нас очень строгие требования к скорости, и еще в 2005 году (когда был написан этот код) тесты производительности показали, что ни один из основных ORM не был таким быстрым, как рукописный SQL.
Проблемы, с которыми мы сталкиваемся сейчас, заставляющие нас думать об ORM:
- Большинство путей в этом коде хорошо протестированы и стабильны. Однако некоторые редко используемые коды склонны к результирующему набору и утечкам соединения, которые очень трудно обнаружить
- В настоящее время мы увеличиваем некоторую дополнительную производительность, добавляя кеширование в наш уровень персистентности, и огромная боль - поддерживать кешируемые объекты вручную в этой установке
- Поддержка этого кода при изменении схемы БД - большая проблема.
Я ищу совет о том, что может быть лучшей альтернативой для нас. Насколько я знаю, ORM продвинулись за последние 5 лет, так что, возможно, сейчас есть тот, который предлагает приемлемую производительность. Поскольку я вижу эту проблему, нам нужно рассмотреть эти моменты:
- Найдите способ повторно использовать хотя бы часть написанного SQL для выражения отображений
- Иметь возможность создавать собственные запросы SQL без необходимости вручную декомпозировать их результаты (т. Е. Избегать ручного
rs.getInt(42)
, поскольку они очень чувствительны к изменениям схемы)
- Добавить неинтрузивный слой кэширования
- Сохранить показатели производительности.
Есть ли какие-либо рамки ORM, которые вы могли бы по этому поводу порекомендовать?
ОБНОВЛЕНИЕ Чтобы понять, о каких показателях производительности мы говорим:
- Бэкэнд-база данных - TimesTen, база данных в памяти, которая работает на том же компьютере, что и JVM
- Мы обнаружили, что изменение
rs.getInt("column1")
на rs.getInt(42)
приносит увеличение производительности, которое мы считаем значительным.