транзакция гибернации совершается крайне медленно, когда сеанс кеширует огромные объекты - PullRequest
0 голосов
/ 22 марта 2019

Две таблицы A (25 тыс. Строк) и B (2,2 млн. Строк), используйте сеанс hibernate, загрузите все эти данные (каждая строка представляет один объект), затем обновите только одну строку в A и одну строку в B в транзакции, I обнаруженное поведение в спящем режиме выглядит странно: для фиксации требуется около 1,5 секунд. Однако журнал базы данных sql показывает, что команда sql update занимает всего несколько миллисекунд. hibernate потребляет большую часть времени до сброса команды sql в базу данных.

Поэтому я использую jprofiler, чтобы узнать, что он делает:

the cpu recording data

Нет никаких подсказок о том, как было потрачено время. Из-за того, что база данных выполняет команду обновления очень быстро, она не должна блокироваться базой данных. Если он выполняет вычисления, он должен быть записан jprofiler (процессор занимает много времени).

Что здесь спящий? Почему коммит такой медленный?

1 Ответ

1 голос
/ 22 марта 2019

Если вы загрузили более 2 миллионов объектов, которые находятся в кэше первого уровня Hibernate, вы не должны удивляться, что дела идут немного медленнее. Скорее всего, время тратится на прохождение всех этих объектов в поисках изменений. Если вы знаете, что вам не нужен объект, вы можете удалить его из кеша. Это уменьшит потребление памяти и ускорит возможную фиксацию. Просто будьте осторожны, чтобы не выселить объекты, которые действительно необходимы, иначе вы создадите неприятные ошибки!

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