Hibernate: избавиться от выбранных данных, хранящихся в куче после чтения - PullRequest
2 голосов
/ 29 августа 2011

Я получил это приложение, которое все, что он делает, выполняет выбор, и после того, как я закончил чтение, мне больше не нужны объекты.

У меня нет проблем с чтением данных, так как запросы очень атомарные. Моя проблема заключается в большом количестве данных, поэтому со временем старые хранимые объекты в куче приводят к исключению нехватки памяти.

Как я могу выполнить выборки, которые избавляются от предыдущих объектов?

Ответы [ 3 ]

0 голосов
/ 29 августа 2011

После того, как вы закончите работать с запрашиваемым объектом, вы должны удалить его из кэша сеанса, а затем разыменовать его, после чего он будет пригоден для сбора мусора. См. Примеры в разделе Управление кэшами Руководства по Hibernate. Вот пример:

ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
while ( cats.next() ) {
    Cat cat = (Cat) cats.get(0);
    doSomethingWithACat(cat);
    sess.evict(cat);
}
0 голосов
/ 29 августа 2011

На объект будет ссылаться кеш сеанса NH. Чтобы избавиться от них, вы могли бы

  • Использовать StatelessSession
  • Clear сеанс после запроса (который также удаляет другие объекты из сеанса)
  • Evict каждый из объектов
  • Использование запроса, который загружает не объекты, а значения или dtos (select a, b или select new Dto(a, b)), которые вообще не используют кэш.
0 голосов
/ 29 августа 2011

Объекты, которые не имеют ссылок на них, будут собираться мусором и не могут вызывать исключения из нехватки памяти.Поэтому, если вы получаете такое исключение, тогда на объекты все еще ссылаются, и вам нужно выяснить, что их удерживает.

Если ошибка вызвана слишком большим набором результатов, вы можете рассмотреть использование разбиения на страницы через setMaxResults() и setFirstResult() или Query.iterate () .

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