Каковы мои варианты оптимизации этой страницы Spring / Hibernate? - PullRequest
2 голосов
/ 30 ноября 2010

У меня есть страница, которая касается большого количества данных в базе данных.Он отображает большое количество данных, а также выполняет на нем достаточное количество вычислений, что было бы очень большой проблемой в группе по запросу или в хранимой процедуре.Намного проще, когда у вас есть модель вашего домена.

В любом случае, в результате Hibernate завершает выполнение TONS запросов по мере извлечения всех данных.На самом деле не имеет значения, получаю я данные с нетерпением или лениво ... все запросы достигают примерно 600-700 мс.

Отдельные запросы выполняются очень быстро.Они даже не 1 мс.Но, как вы видите, эта страница выполняет множество запросов для таблицы, в которой перечислены результаты учебного курса для 58 студентов:

0 ms  JDBC SELECT (MODULE)
0 ms  JDBC SELECT (TASK)
0 ms  JDBC SELECT (USER_ACCOUNT) // student #1
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (USER_ACCOUNT)
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (USER_ACCOUNT)
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)

0 ms  JDBC SELECT (USER_ACCOUNT) // student #2
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (QUESTION)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (KEYWORD)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_FILL_IN_THE_BLANK_ANSWER)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_FILL_IN_THE_BLANK_ANSWER)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)

0 ms  JDBC SELECT (USER_ACCOUNT) // student #3
....
0 ms  JDBC SELECT (USER_ACCOUNT) // student #58
0 ms  JDBC SELECT (ACTIVE_TASK)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (ACTIVE_QUESTION)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_LANGUAGE_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)
0 ms  JDBC SELECT (QUESTION_RESULT_TO_KEYWORD)

Очень часто 30–60 студентовпройти курс, чтобы 600-700 мс убили сервер.

Чтобы дать представление о сложности, вот отношения 1-M:

Module (1) -> Task-> Вопрос-> Ключевое слово

ActiveModule (1) -> ActiveTask-> ActiveQuestion-> QuestionResult-> Keyword, LanguageKeyword

Также есть и другие ссылки 1-M:

Module-> ActiveModule

Task-> ActiveTask

Question-> ActiveQuestion

По сути, это действительно сложный граф данных.

Какие у меня варианты?Сервер, на котором работает это приложение, имеет только 1 ГБ ОЗУ, поэтому о кэшировании отдельных объектов практически не может быть и речи.Я не знаю, принесет ли Hibernate меньше запросов.Их так много.

Схема для этого приложения очень древовидная, глубокая и сложная.К сожалению, все эти данные необходимы.Деревья в основном все или ничего.

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Используйте представление.Это должно оптимизировать ваши объединения и уменьшить количество отдельных запросов, которые вам нужно сделать.

0 голосов
/ 01 декабря 2010

Я думаю, вы могли бы легко сделать это, используя один или два SQL-запроса, присоединяющихся к

ActiveModule (1) -> ActiveTask-> ActiveQuestion-> QuestionResult-> Keyword, LanguageKeyword

Вы могли бы даже выгрузить некоторые из своих вычислений на движке базы данных.

Подобные вещи тривиальны для любой современной базы данных, игнорируют спящий режим и просто проходят необработанный SQL-запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...