Создание веб-приложений с использованием современных ORM-фреймворков
Объектно-реляционное отображение. ORM-фреймворки. Загрузка по требованию как шаблон проектирования. Способы расширения классов-сущностей. Внедрение в байт-код. Загрузка полей и свойств сущностей в detached состоянии. Механизм пакетной выборки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 07.07.2012 |
Размер файла | 1,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
List<Test> tests = entityManager
.createQuery(“SELECT DISTINCT t FROM Test t LEFT JOIN FETCH t.categories WHERE t.addedBy.id = :uid”)
.setParemeter(“uid”, uid)
.getResultList();
Благодаря чему и тесты и соответствующие им категории получаются из базы данных за один SQL запрос.
5.3 Оцениваемые параметры
При оценке каждого из описанных подходов учитывались 2 количественные характеристики:
1) общее количество SQL запросов, которое генерирует конкретный JPA провайдер
2) общее время, затрачиваемое обработку этих запросов
Обе приведенные характеристики замерялись в контексте использования загрузки по требованию на странице преподавателя, описанной ранее.
5.4 Условия сравнения
Для того чтобы оценить реальный ущерб, который наносит проблема N+1 выборок при оценке описанных характеристик использовались следующие входные параметры:
От имени преподавателя было создано 10 категорий и 200 тестов. Каждый из 200 тестов принадлежал в свою очередь, к 10 категориям. Таким образом, суммарное число сущностей, которое необходимо было извлечь из базы данных: 1 + 10 + 200 + 200 * 10 = 2211.
Тестирование проводилось с использованием СУБД PostgreSQL 9.1.3 и сервера приложений Glassfish 3.1.2 на машине с процессором AMD A6 и 4гб памяти DDR3.
5.5 Результаты сравнения
В таблице 2, приведены результаты сравнения различных способов оптимизации загрузки по требованию:
Таблица 2.
Сравнительная характеристика.
Hibernate |
EclipseLink |
OpenJPA |
||||
шт. / мс. |
шт. / мс. |
шт. / мс. |
||||
FetchType.LAZY |
203 / 760 |
203 / 640 |
203 / 890 |
|||
FetchType.EAGER |
203 / 750 |
203 / 650 |
4 / 224 |
|||
FetchType.LAZY+ пакетная выборка |
@BatchSize(size =128) |
@BatcFetch(BatchFetchType.*) |
- |
|||
JOIN |
IN |
EXISTS |
||||
6 / 250 |
4 / 130 |
4 / 100 |
4 / 140 |
|||
JOIN FETCH |
3 / 187 |
3 / 305 |
3 / 237 |
Первая цифра в каждой ячейке отражает количество запросов к базе данных за время обработки запроса пользователя, а вторая суммарное время, которое ушло на обработку этих запросов.
Сразу можно отметить несоизмеримое количество запросов 203 и 3-6, это сказывается эффект проблемы N+1 запросов, из-за которой в случае обычной загрузки, по требованию, то есть в первой строке, получаем наихудший результат и соответственно наибольшее время.
Не смотря на то, что в теории предварительная загрузка должна была быть оптимальным выбором, на практике это оказалась не так. Ни Hibernate не EclipseLink не справились в описанной ситуации правильно сформировать запросы к базе данных. С этой задачей, справился только OpenJPA, показав исключительно хорошее время.
Однако при этом только в OpenJPA отсутствует механизм пакетной выборки.
При использовании Hibernate ограничение на размер пакетной выборки дало о себе знать, поэтому EclipseLink немного обошел его по производительности и количеству запросов.
Однако, не смотря ни на что ни один из подходов кроме использования JOIN FETCH не смог добиться минимального результата, ограничившись всего тремя запросами к БД.
ЗАКЛЮЧЕНИЕ
Просуммировав все вышесказанное, хотелось бы отметить, что
1) В противовес распространенному заблуждению, загрузка по требованию не всегда является самой эффективная стратегией.
2) Как показали результаты сравнения, предварительная загрузка в рамках JPA не всегда решает проблему N+1 выборок, JPA провайдеры иногда не могут эффективно сформировать запросы к базе данных.
3) В крайнем случае, когда надо уменьшить количество запросов до минимума, для каждой отдельной ситуации необходимо писать отдельный JPQL запрос, иногда даже не один.
4) Загрузка по требованию - это ни в коем случае не фича, ее нельзя использовать бездумно или просто игнорировать, конфигурация ленивой загрузки является важным аспектом при разработке системы с использованием ORM и должна приниматься в расчет еще на этапе проектирования приложения.
СПИСОК ЛИТЕРАТУРЫ
1. Мартин Фаулер, Архитектура корпоративных программных приложений, -- М.: Вильямс, 2008 . -- 544 с.: ил. ISBN 5-8459-0579-6
2. Java Platform, Enterprise Edition (Java EE) Technical Documentation. [Электронный ресурс]. URL: http://docs.oracle.com/javaee/ (дата обращения 15.12.2011);
3. Hibernate Reference Documentation. [Электронный ресурс]. URL: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/ (дата обращения 15.12.2011);
4. The EclipseLink JPA User's Guide. [Электронный ресурс]. URL: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA (дата обращения 15.12.2011);
5. Apache OpenJPA 2.2 User's Guide. [Электронный ресурс]. URL: http://openjpa.apache.org/builds/2.2.0/apache-openjpa/docs/manual.html (дата обращения 15.12.2011);
6. Spring Framework Reference Documentation [Электронный ресурс]. URL: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/ (дата обращения 15.12.2011);
7. Spring Persistence with Hibernate / Paul Tepper Fisher, Brian D. Murphy -- Appres, 2010 . -- 264 с.: ил. ISBN 978-1-4302-2632-1;
8. Maarten Winkels, Advanced Hibernate: Proxy Pitfalls. [Электронный ресурс]. URL: http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/ (дата обращения 13.06.2012);
Размещено на Allbest.ru
Подобные документы
Архитектура и технология функционирования системы. Извлечение, преобразование и загрузка данных. Oracle Database для реализации хранилища данных. Создание структуры хранилища. Механизм работы системы с точки зрения пользователя и с точки зрения платформы.
курсовая работа [2,2 M], добавлен 22.02.2013Выявление сущностей и связей, атрибутов сущностей и назначение первичных ключей при разработке базы данных. Реляционная модель данных. Описание стадий жизненного цикла информационной системы: анализ, проектирование, реализация, внедрение, сопровождение.
курсовая работа [152,2 K], добавлен 11.05.2014Анализ объектно-ориентированного программирования, имитирующего способы выполнения предметов. Основные принципы объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм. Понятие классов, полей, методов, сообщений, событий.
контрольная работа [51,7 K], добавлен 22.01.2013Средства программирования, описание языка С++. Назначение программы, требования к документации. Стадии разработки, виды испытаний. Используемые технические, программные средства. Вызов и загрузка, входные и выходные данные. Программа и методика испытаний.
контрольная работа [205,3 K], добавлен 23.07.2013Проверка существования и статуса файла. Определение его размера. Открытие файла для чтения, записи, добавления. Закрытие файловых дескрипторов. Запись из переменной в файл. Загрузка файла из сети. Создание и удаление каталога. Функции работы с каталогами.
презентация [133,9 K], добавлен 21.06.2014Требования, предъявляемые к инфологической модели, ее компоненты. Построение модели и диаграммы "объект — свойство — отношение". Три типа бинарных связей. Подтипы и супертипы сущностей в языках программирования. Каскадные удаления экземпляров сущностей.
лекция [404,3 K], добавлен 17.04.2013Информационный анализ и выявление основных сущностей предметной области. Определение взаимосвязей сущностей. Построение концептуальной модели. Логическое моделирование базы данных "Компьютерный мир". Технология сбора, передачи и обработки информации.
курсовая работа [1,9 M], добавлен 13.02.2014Общее определение и история создания JavaScript библиотек, их назначение и использование. Виды и особенности JS фреймворков. Создание клиентского приложения (каталога комплектующих компьютера), написание кода страницы с использованием фреймворка Jquery.
курсовая работа [544,5 K], добавлен 17.12.2013Общая схема процесса загрузки, его основные этапы и отличительные особенности. Первичный и вторичный загрузчики, их функциональные возможности и направления действия. Места возможного размещения загрузочного сектора. Требования к дисковому пространству.
презентация [86,1 K], добавлен 20.12.2013Обследование предметной области. Проектирование реляционной базы данных: описание входной и выходной информации, перечень сущностей и атрибутов, создание модели, выбор ключей. Разработка и обоснование представлений для отображения результатов выборки.
курсовая работа [539,0 K], добавлен 12.12.2011