Каждый раз, когда я получаю сущность из HIbernate, а затем отбрасываю, Hibernate зависает на любых ресурсах - PullRequest
0 голосов
/ 10 октября 2018

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

Поэтому я использую только одну сущность SongDiff одновременно, поэтому мой вопрос - будет ли Hibernate?освободить такие ресурсы, как обойти цикл, или он может зависнуть на нем, мне нужно время от времени вызывать session.flush() или это ничего не изменит?

Я только получаю данные из Hibernate, я не изменяюлюбые данные

Я спрашиваю, потому что код с OutOfMemory Ошибка в этой области кода, и мне интересно, может ли это быть проблемой.

try
{
    session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();

    for(Integer recNo:recNos)
    {
        count++;

        //Get Metadata changes
        SongDiff                songDiff    = SongChangesCache.getSongDiffFromDatabase(session, recNo);
        MetadataAllChanges      mas         = (MetadataAllChanges) SerializationHelper.deserialize(songDiff.getDiff());
        sr.writeDatatoXlsFile(recNo, mas);
    }
}
finally
{
    HibernateUtil.closeSession(session);
}

1 Ответ

0 голосов
/ 14 октября 2018

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

Наиболее очевидный способ избежать наращивания сеанса - начать новый сеанс., но это не всегда практично, например, из-за объема транзакций.

Лучшее решение в рамках одного сеанса - session.clear(), которое отбрасывает любые экземпляры сущностей, которые были созданы в сеансе.Если в цикле также происходят обновления, вам нужно будет сделать session.flush() перед clear(), чтобы перенести все изменения в базу данных.

Другой вариант, по крайней мере, в пределахЧистая среда Hibernate (не JPA) представляет собой StatelessSession , которая не имеет StatefulPersistenceContext, поэтому не собирается.Я пробовал это пару раз, но смущаюсь рекомендовать его - он, кажется, менее широко используется, поэтому труднее находить неисправности в Интернете.

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