2013-04-22 4 views
0

Есть ли теоретическая возможность, что использование template.fetch() может привести к OutOfMemoryException? Скажем, например, что существует цикл, который петли 100 раз и каждый раз вызывается template.fetch(). Это было бы что-то вроде этого:Spring Data Neo4j template.fetch(), ведущий к OutOfMemory?

List<Building> buildings = repository.getBuildings(); 
for(Building b : buildings) { 
    Country c = repository.include(b.getCountry()); // this calls template.fetch() 
    // do something with country.. 
} 

После определенного количества петель Выборка получает очень медленно, а затем он бросает OutOfMemoryException. Может ли проблема выборки, и если это так, как это можно обработать?

Приветствия

+1

Fetch просто загружает объекты в память, либо модифицирует ваш код, чтобы не загружать каждый объект в память или не увеличивать объем памяти, кроме того, я не думаю, что могут быть другие решения. – remigio

+0

Спасибо @remigio! Вы знаете, есть ли способ удалить загруженные объекты памяти во время выполнения? – paf

+0

Объекты, извлеченные из neo4j, ничем не отличаются от простых объектов Java, поэтому они удаляются сборщиком мусора при выходе из области видимости. В вашем случае, если они назначены локальным переменным внутри цикла for, они помечены как мусор, собранный, как только цикл for завершается. – remigio

ответ

1

Fetch просто загружает объекты в памяти, вы должны либо изменить код, чтобы не загружать каждый объект в памяти или увеличить размер памяти. Кстати, поскольку объекты, извлеченные из neo4j, ничем не отличаются от простых Java-объектов, они удаляются сборщиком мусора при выходе из области видимости. В вашем случае, будучи привязанным к локальной переменной внутри цикла for, их жизнь продолжается от времени назначения до следующего назначения, и даже последний назначенный умирает, как только цикл завершается.

Смежные вопросы