首先,一点背景。我正在开发从 SQL Server 中提取数据的管理软件。我正在使用JPA
创建Entity
表的实例以在管理软件中进行操作(我现在只使用JPA
了几天)。作为测试,我将下面的代码放在一起来测试存储他们最丰富的表 (PeriodicalTable) 的对象将占用多少内存,该表有 18,500 行(或大约)并且只会增长;
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 ,上面的代码也会抛出。我不想使用更多内存,因为运行该软件的计算机只有大约 2GB 的 RAM。现在,我可以.setMaxResults()
针对每个查询使用(如您所见已注释掉),但这并不理想,因为我需要在最终产品中显示所有这些查询。
所以,问题。在使用 JPA 时,是否有任何更高效的内存方法可以在表中的每个实体上运行 toString?这些不同方法的优缺点是什么?我曾考虑过可能只存储传递的字符串值的列表,但如果不首先使用并将结果存储在列表中.toString()
,就想不出一种方法。.getResultList()
编辑:作为一个方面,我正在使用 Java 标准 JPA 并且没有研究过 Hibernate 或 ObjectDB 或类似的东西。除非它们的使用是必要的,否则我打算避免学习不必要的技术。