首先,有一點背景。我正在致力於從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();
}
上面的代碼拋出,即使我提出-Xmx到512M java.lang.OutOfMemoryError: Java heap space
。我不想使用更多的內存,因爲這個軟件運行的電腦只有大約2GB的內存。現在,我可以對每個查詢使用.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(){返回引用;}引用只是一個字符串。 –