Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate, утечка памяти?


Автор: unkis 1.5.2007, 12:25
Ребята надо сохранять около 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, я так понимаю, память и должна отдаваться обратно, но не отдаётся.

Автор: tux 1.5.2007, 14:04
Пока сессию не закроешь все объекты хранятся в кэше этой сессии.

Автор: unkis 1.5.2007, 14:55
ага спасибо, только что-то всё равно не работает, 
После того как 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)
    


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

Автор: Tony 2.5.2007, 17:56
java.lang.StackOverflowError .Огромная коллекция.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)