Во-первых, немного фона. Я работаю над ПО управления, которое извлекает данные с SQL Server. Я использую JPA
для создания Entity
экземпляров таблиц для манипуляций в программном обеспечении управления (я использовал только JPA
в течение нескольких дней). В качестве теста я объединил приведенный ниже код, чтобы проверить, сколько памяти будет занято для хранения объектов их наиболее распространенной таблицы (PeriodicalTable), которая имеет 18 500 строк (или там около) и может только расти;Проблемы управления памятью JPA
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceDemoPU");
EntityManager em = emf.createEntityManager();
Query query = em.createQuery("SELECT p FROM PeriodicalTable p");
//query.setMaxResults(7000);
List<PeriodicalTable> results = query.getResultList();
PeriodicalTable storedPlayer;
for (int i = 0; i < results.size(); i++){
storedPlayer = results.get(i);
System.out.println(storedPlayer.toString());
if (i == (results.size()-1)){System.out.println("Total results: "+(i+1)); }
}
em.close();
emf.close();
}
Приведенный выше код бросает java.lang.OutOfMemoryError: Java heap space
хотя я поднял -Xmx до 512m. Я не хочу использовать больше памяти, потому что компьютеры, на которых будет работать это программное обеспечение, имеют примерно 2 ГБ оперативной памяти. Теперь я могу использовать .setMaxResults()
для каждого запроса (как вы можете видеть, прокомментированный), но это не идеально, потому что мне нужно будет отобразить их все в конечном продукте.
Итак, вопрос. Есть ли еще более эффективные для памяти методы запуска toString для каждого объекта в таблице, при использовании JPA? Каковы плюсы и минусы этих разных методов? Я подумал о том, что возможно только сохранение списка значений String, переданных .toString()
, но не могу придумать способ сделать это, не используя сначала .getResultList()
и сначала сохраняя результаты в списке.
Редактировать: В качестве стороны я использую Java Standard JPA и не смотрел в Hibernate или ObjectDB или что-то в этом роде. Если их использование не является существенным, я намереваюсь избегать изучения большего количества технологий, чем это необходимо.
Не могли бы вы показать свою реализацию toString() для PeriodicalTable. –
Может помочь - чтение страницы за страницей: http://java-persistence-performance.blogspot.com/2011/06/how-to-improve-jpa-performance-by-1825.html –
@Rob Blake - 'public String toString() {return reference;} 'reference - это просто строка. –