Роль запросов гибернации в дампе кучи

Я JProfiling анализирую свое приложение высокая загрузка процессора. Загрузка ЦП составляет 100 % (на сервере) во время входа пользователя в систему. Так начал профилировать мое приложение.

Приведенные ниже строки запроса я нашел в дампах кучи. Не только эти 4 запроса, таких запросов в дампе сотни.

java.lang.String (0x3262b1) ["/* load com.v4common.shared.beans.transaction.ControlTransaction */ select controltra0_.id as id47_48_, controltra0_.form_transaction_id as form2_47_48_, controltra0_.string_value as string3_47_48_, c"]     129 kB (0 %)
java.lang.String (0x310b2f) ["/* load com.v4common.shared.beans.transaction.ReportTransaction */ select reporttran0_.id as id158_45_, reporttran0_.report_id as report2_158_45_, reporttran0_.norm_id as norm3_158_45_, reporttran0_.d"]     124 kB (0 %)
java.lang.String (0x312222) ["/* load com.v4common.shared.beans.transaction.ReportItemTransaction */ select reportitem0_.id as id160_41_, reportitem0_.report_structure as report2_160_41_, reportitem0_.grid_row_criteria as grid3_16"]     110 kB (0 %)
java.lang.String (0x30c104) ["/* load com.v4common.shared.beans.Reports.EsenderCSReport */ select esendercsr0_.id as id117_36_, esendercsr0_.name as name117_36_, esendercsr0_.report_type as report3_117_36_, esendercsr0_.is_show_pr"]     94,248 bytes (0 %)
java.lang.String (0x30d1dc) ["/* load com.v4common.shared.beans.Reports.ReportStructure */ select reportstru0_.id as id120_35_, reportstru0_.name as name120_35_, reportstru0_.xml as xml120_35_, reportstru0_.esender_format as esend"]     90,736 bytes (0 %)

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

Любые идеи, почему эти строки находятся в дампе?

Или что вообще означает эта строчка?


person Suresh Atta    schedule 07.03.2014    source источник
comment
Насколько я знаю, это вызвано кешем запросов гибернации, но я не знаю, как сделать так, чтобы спящий режим не сохранял эти запросы.   -  person Luiggi Mendoza    schedule 07.03.2014
comment
@LuiggiMendoza Спасибо. Но я еще ни разу не запускал эти запросы. Тем не менее, они кэшируются ?? или во время запуска приложения спящий режим сделать так??? Можете ли вы сказать мне это ?? Я не знаю об этом. И можем ли мы отключить этот query cache с помощью какой-либо конфигурации ??   -  person Suresh Atta    schedule 07.03.2014
comment
Вы уверены, что не загружаете исходные данные при развертывании приложения?   -  person Luiggi Mendoza    schedule 07.03.2014
comment
@LuiggiMendoza Я думал так же и перепроверил запросы, запускаемые при загрузке данных после входа в систему, включив mysql=true. Я вовсе не касаюсь вышеупомянутых bean-компонентов (таблиц базы данных). Тем не менее я могу видеть эти строки в дампе кучи.   -  person Suresh Atta    schedule 07.03.2014
comment
1) На мой взгляд, как только процессор загружается, я начинаю с потоков, а не с кучи. Основываясь на моем опыте и понимании, если один высокий, другой остается низким (есть и некоторые редкие исключения). 2) Проверьте свои XML/конструкторы, чтобы убедиться, что во время инициализации не выполняются запросы.   -  person kosa    schedule 07.03.2014
comment
Если нет другого процесса, который запускает эти запросы, то, возможно, Hibernate запускает их намеренно? Да, это очень странно, и у нас тоже есть похожая проблема. Мы взяли дамп кучи и проанализировали его с помощью MAT и обнаружили, что утечка памяти произошла из-за этой функции Hibernate, но до сих пор не можем это исправить.   -  person Luiggi Mendoza    schedule 07.03.2014
comment
Если мы явно не укажем, спящий режим не кэширует запросы. Я сильно подозреваю, что из предыдущих вызовов не было GCed.   -  person kosa    schedule 07.03.2014
comment
@Nambari Я уже пытался отключить эту функцию, но тоже не сработало...   -  person Luiggi Mendoza    schedule 07.03.2014
comment
У меня есть подозрение, что эти строки никак не связаны и на самом деле не используются для запросов (пока), просто хранятся в памяти. Можете ли вы включить какой-либо журнал запросов, чтобы подтвердить, действительно ли запросы выполняются? Что-то вроде этого или на стороне базы данных? Если запросы еще не запущены, это, вероятно, означает, что они не вызывают 100% загрузку ЦП.   -  person eis    schedule 11.03.2014
comment
Сначала я беспокоился о загрузке процессора. Но позже я удивился, почему эти запросы существуют. Хотя я беспокоюсь об использовании процессора, эти неиспользуемые строки съедают мою память, верно?   -  person Suresh Atta    schedule 11.03.2014
comment
эти запросы не могут быть причиной высокой загрузки ЦП, это должно быть что-то еще. в худшем случае они будут потреблять много памяти, но не ЦП, но потребление памяти также не должно быть проблемой. Попробуйте использовать visualvm, который устанавливается вместе с JVM, для профилирования использования ЦП, это очень удобный инструмент visualvm.java.net   -  person Angular University    schedule 18.03.2014


Ответы (2)


Это нормально, это предварительно подготовленные запросы Hibernate, которые готовятся во время запуска сервера.

Возьмем, к примеру, класс ControlTransaction. Hibernate уже знает, что, вероятно, потребуются запросы для выбора сущностей по ID, их удаления и т. д.

Таким образом, он заранее генерирует ряд подготовленных SQL-операторов для выполнения этих операций. Комментарии в начале каждого запроса указывают, почему они были сгенерированы.

Например, этот запрос был сгенерирован для загрузки ControlTransaction по идентификатору:

/* load com.v4common.shared.beans.transaction.ControlTransaction */ 
select controltra0_.id as id47_48_, controltra0_.form_transaction_id as form2_47_48_, controltra0_.string_value as string3_47_48_, c 

Запросы, которые начинаются с комментариев one-to-many или one-to-one, используются для ленивой загрузки и т. д. Именованные запросы в JPQL/HQL также компилируются в SQL-запрос при запуске сервера, и комментарий определяет, какой именно именованный запрос породил SQL-запрос.

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

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

person Angular University    schedule 11.03.2014

У вас есть эти запросы как @NamedQueries (или @NamedQuery) на какой-либо из ваших объектов?

Hibernate может загружать именованные запросы в свой кеш во время запуска сервера. Они обязательно анализируются при запуске для проверки синтаксиса и т. д.

person DuncanKinnear    schedule 17.03.2014
comment
Нет. У меня нет вопросов. Я использую API критериев. - person Suresh Atta; 18.03.2014