Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate, утечка памяти? 
:(
    Опции темы
unkis
  Дата 1.5.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята надо сохранять около 800000 объектов, в памяти деожпать я их не могу, поэтому сохраняю по 5000.

То есть у меня есть ArrayList в который я добавляю объекты и проверяю делится ли без остатка на 5000 если да то сохраняй и создавай новый ArrayList, и опять всё заново.

Проблема в том что после сохранения первых 5000 Hibernate не отдаёт память обратно, собственно вот и вопрос почему?

Код

public class Controller2 {
    private static ArrayList<RequestLocation> requestLocationList = new ArrayList<RequestLocation>();

    EntityManagerFactory emf;

    private EntityManager entityManager;

    private EntityTransaction tx2;

    private Controller2() {// Один раз за подключаемся к бд на всё
        // выполнение программы.
        emf = Persistence.createEntityManagerFactory("example",
                new Properties());
        entityManager = emf.createEntityManager();
        tx2 = entityManager.getTransaction();

    }

    public void start() {
        while ((s = br.readLine()) != null) {
                
            //Здесь создаются обекты и добовляются в ArrayList
            createObjects(requestType, requestParams);

            requestCounter++;
            if (requestCounter % 5000 == 0) {
                System.out.println(requestCounter);
                //Здесь происходит сохранение моих обектов
                saveRequestLocation();
                //Создаём новый ArrayList
                this.requestLocationList = new ArrayList<RequestLocation>();

            }

        }
    }

    public synchronized Long saveRequestLocation() {

        try {

            tx2.begin();

            for (RequestLocation requestLocation : requestLocationList) {
                Location location = entityManager.find(Location.class,
                        requestLocation.getLocation().getLocation_id());
                if (location == null) {
                    entityManager.persist(requestLocation.getLocation());
                    entityManager.persist(requestLocation);
                } else {
                    requestLocation.setLocation(location);
                    entityManager.persist(requestLocation);
                }
            }
            tx2.commit();

        } catch (Exception e) {

            e.printStackTrace();
            System.err.println(e.getMessage());
            System.exit(0);
        }

        return null;

    }

}




Сохранение как видно из кода происходит следующим образом, начинается транзакция, потом 5000 объектов делаются prsistent и только потом они все делаются comit и сохраняются в БД.

Вот после этого comit, я так понимаю, память и должна отдаваться обратно, но не отдаётся.


Это сообщение отредактировал(а) unkis - 1.5.2007, 12:31


--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 1.5.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Пока сессию не закроешь все объекты хранятся в кэше этой сессии.
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
  Дата 1.5.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



ага спасибо, только что-то всё равно не работает, 
После того как comit();, добавил вот это entityManager.clear(); то есть очищаю cash. 

но теперь, когда он хочет сохранить следующие 5000 при попытке поиска то есть
Код

Location location = entityManager.find(Location.class,
                        requestLocation.getLocation().getLocation_id());


вываливается вот такое Exception.

Код

Exception in thread "main" java.lang.StackOverflowError
    at org.hibernate.type.CollectionType.getElementsIterator(CollectionType.java:179)
    at org.hibernate.engine.CascadingAction.getAllElementsIterator(CascadingAction.java:415)
    at org.hibernate.engine.CascadingAction.access$100(CascadingAction.java:27)
    at org.hibernate.engine.CascadingAction$8.getCascadableChildrenIterator(CascadingAction.java:299)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:294)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
    at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:111)
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:84)
    at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:609)
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:601)
    at org.hibernate.engine.CascadingAction$8.cascade(CascadingAction.java:295)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
    at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:111)
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:84)
    at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:609)
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:601)
    at org.hibernate.engine.CascadingAction$8.cascade(CascadingAction.java:295)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    


Что опять не так?


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Tony
Дата 2.5.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



java.lang.StackOverflowError .Огромная коллекция.


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.