3

首先,一点背景。我正在开发从 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 或类似的东西。除非它们的使用是必要的,否则我打算避免学习不必要的技术。

4

3 回答 3

3

query.setMaxResults()您可以尝试使用和对结果进行分页query.setFirstResult()。这样,您可以以例如 2500 行的块的形式加载结果。

于 2013-08-29T10:28:14.280 回答
2

一般来说,ORM 不适合加载和处理大量数据。无论您的实现有多高效,ORM 都会使用大量内存和 CPU,因为它们高度依赖反射。正如您在他们的文档中看到的那样,它们是为加载-修改-持久方案而设计的。如果你需要加载和显示大量数据,你肯定需要分页。

于 2013-08-29T10:31:38.717 回答
0

请检查 PeriodicalTable 映射和延迟加载对象。

于 2013-08-29T10:33:27.407 回答