У меня есть проект, в котором мы проводим ночной тест производительности. Это один и тот же тест каждую ночь, когда на наш сайт попадают сотни одновременных «пользователей» в течение 3 часов. Результаты работы заканчиваются в одном из двух состояний - плохом или хорошем, и каждое состояние, похоже, согласуется с самим собой. Наш парень из базы данных (oracle btw) заметил, что в дни плохой производительности у нас было бы гораздо больше звонков, чем в хорошие дни, но только из одного запроса.Что может привести к тому, что производительность Hibernate будет колебаться недетерминированным образом?
Из моего анализа до сих пор я думаю, что он имеет отношение к спячке, предпочитая использовать/не использовать прокси-серверы, но я не могу понять, что бы спустило спящий режим на несколько дней, а не на другие. Что может вызвать такое неустойчивое недетерминированное поведение в Hibernate? Я нахожусь в Hibernate 4.2.0 и весной. Мы не используем кеш второго уровня. На наших серверах нет других приложений.
Объект, вызывающий выброс этого вызова, находится в конце длинной цепочки объектов, которые связаны через родительский/дочерний объект. Мы работаем руководителем этой сети.
Неудачный запуск, уведомление 4m казни в 9wu ... запрос
Хороший бег, обратите внимание 630K выполнений 9wu ... запрос
Edit: Я не в состоянии чтобы в основном воспроизвести это в модуле. Похоже, что когда у меня -xmx установлен очень низкий (28 м), дополнительных вызовов нет, но в xmx = 128m я получаю его большинство прогонов. Любые подсказки о том, где в Hibernate я могу понять, почему/как он примет решение о том, должен ли он прокси-сервер или нет?
Редактировать 2: Я не могу последовательно воспроизводить в своем модуле. Он отлично подойдет для 5 прогонов, а затем не будет работать 3, а затем сработает. Каждый раз, когда я запускаю то же самое единичное тестирование. Кажется, это проблема N + 1, она загружает кучу детей через запрос «select item0 ...», но во время хорошего запуска решает использовать другой запрос или не отбрасывает записи между webservice звонки. Я увижу, что я могу сделать, чтобы запутать объекты и предоставить некоторые подробности. К сожалению, к сожалению, это дерево, хранящееся в базе данных, и использует наследование с дискриминатором.
Я заинтересован в ваш «Из моего анализа до сих пор я думаю, что он имеет отношение к спячке, предпочитая использовать/не использовать прокси». О каком «прокси» вы имеете в виду? Если вы говорите про прокси для сущностей, я никогда не слышал, чтобы Hibernate создавал прокси-серверы недетерминированным образом. Можете ли вы продолжить эту работу? –
Мне кажется, что это что-то вроде: 1. Вы оставили длинную цепочку объектов, все ленивые. 2.В некоторых случаях вы просто перемещаете небольшую часть своей цепочки (что является хорошим случаем), в то время как в некоторых случаях вы перемещаете большую часть цепи, что приводит к огромному количеству ленивой выборки (что является плохим случаем). 3. или, в некоторых особых случаях, вы делаете выборку «un-reusable n + 1». Я настоятельно рекомендую вам иметь правильное ведение журнала в Hibernate и исследовать, в каком случае существует огромное количество генерируемых SQL (что должно быть очевидно) –
вы могли бы разместить свои сопоставления, связанные с запросом? Я бы посоветовал вам включить нетерпеливую выборку на отображение и посмотреть, существует ли еще такое «неустойчивое недетерминированное поведение» –