Спящий режим замедляется со временем - PullRequest
0 голосов
/ 12 февраля 2020

Мой проект широко использует Hibernate для извлечения объектов данных из Postgresql (мы используем Hibernate 4.2.15 и Postgresql 10.1-3). Код выглядит следующим образом:

public void hibernateSlowdown() {
    BigObject bigObject = new BigObject();
    for (int i=0 ; i<nObjects ; i++) {
        Target target = targetCrud.retrieve(i); // targetCrud has the Hibernate calls
        BigObject.target = target; 
        ...
        CustomSerializer.serialize(bigObject);
    }
}

Ведение журнала показывает, что, поскольку код выполняется на очень большом количестве итераций (примерно 10000), каждая итерация занимает больше времени, чем последняя. Я убежден, что проблема связана с кэшированием в Hibernate по следующим причинам:

  1. Благодаря расширенному ведению журнала ясно, что единственной частью l oop, которая занимает больше времени на каждой итерации, является targetCrud Вызов .retrieve (i).
  2. Когда я добавил вызов метода грубой силы к сеансу clear (), производительность значительно улучшается и, в частности, больше не замедляется с течением времени (или, скорее, она замедляется до тех пор, пока вызов clear (), а затем снова ускорение).

Я надеялся, что использование метода evict () для удаления объектов Target из кэша Hibernate даст мне сопоставимые результаты, но - нет игра в кости с настойчивым усилием выселить все целевые объекты, выполнение все еще замедляется с течением времени так же, как описано выше.

Одна из проблем заключается в том, что класс Target представляет собой беспорядок встраиваемых объектов во встроенных объектах, некоторые объекты имеют аннотации FetchType или Cascade, а другие нет, в частности, у Target есть встроенный объект Aperture, который, в свою очередь, имеет родительский объект Target в качестве члена (поэтому target.aperture.target = target).

Любые предложения о том, как я могу оценить производительность без грубой силы очистки кеша? Или как я могу заставить вызовы evict () работать сравнимо с очисткой кэша? Что мне нужно знать о типах выборки, каскадах и т. Д. c., Чтобы убедиться, что объект с несколькими слоями встроенных объектов действительно удаляется из кэша? Или что-то более фундаментальное в том, как работает кеш Hibernate, означает, что выселение не решит мою проблему, и мне придется жить с очисткой кеша? Спасибо!

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