먼저 작은 배경. SQL Server에서 데이터를 가져 오는 관리 소프트웨어에 대해 연구하고 있습니다. 나는 JPA
을 사용하여 관리 소프트웨어 내에서 조작하기위한 테이블 인스턴스 인 Entity
을 생성합니다 (지금은 이틀 동안 JPA
만을 사용했습니다). 테스트로서, 아래 코드를 사용하여 18,500 행 (또는 abouts)의 가장 풍부한 테이블 (PeriodicalTable)의 개체를 저장하는 데 얼마나 많은 메모리가 차지 될지 테스트하고 성장 가능성이 높습니다.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();
}
위의 코드는 내가 512m에 -Xmx을 제기에도 불구하고 java.lang.OutOfMemoryError: Java heap space
가 발생합니다. 이 소프트웨어가 실행될 컴퓨터에는 약 2GB의 RAM 만 있기 때문에 더 이상 메모리를 사용하고 싶지 않습니다. 이제 각각의 쿼리에 대해 .setMaxResults()
을 사용할 수 있지만 (주석으로 볼 수 있듯이) 최종 제품에 모든 것을 표시해야하므로 이상적이지 않습니다.
그래서, 질문입니다. JPA를 사용하면서 테이블의 모든 엔티티에서 toString을 실행하는 메모리 효율적인 방법이 있습니까? 이러한 여러 가지 방법의 장단점은 무엇입니까? 나는 어쩌면 .toString()
에 의해 전달 된 문자열 값 목록을 저장하는 것에 대해서 생각해 보았지만, 먼저 .getResultList()
을 사용하지 않고 그 결과를 목록에 먼저 저장하는 방법을 생각할 수 없습니다.
편집 : 한 편으로서 Java Standard JPA를 사용하고 있으며 Hibernate 또는 ObjectDB 또는 그와 유사한 것을 조사하지 않았습니다. 그들의 사용이 필수적이지 않으면, 필자는 필요한 것보다 더 많은 기술에 대해 배우는 것을 피하려고합니다.
PeriodicalTable에 대한 toString() 구현을 보여 주실 수 있습니까? –
도움이 될 수 있습니다 - 페이지별로 페이지 읽기 : http://java-persistence-performance.blogspot.com/2011/06/how-to-improve-jpa-performance-by-1825.html –
@Rob Blake -'public String toString() {return reference;}'참조는 단지 String입니다. –