首先,有一点背景。我正在致力于从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(){返回引用;}引用只是一个字符串。 –