java - 如何限制 JPA Batch 查询的内存使用?

标签 java jpa batch-file eclipselink

我目前正在使用 JPA(Eclipse 链接)批量查询从数据库中读取一个对象。每个对象都有几个子集合,也通过 JPA 反射(reflect)出来。

我使用批量查询来获得它们提供的性能,但是有一个缺点(也许是可以避免的,因此我的问题)。

给定以下对象定义(已更改名称以保护无辜者,但结构保持不变)。

@Entity
@Table(name = "TBL_ITEMX")
class ItemX
{
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
    @BatchFetch(value = BatchFetchType.JOIN)
    private Collection<SubItem1> subItem1;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
    @BatchFetch(value = BatchFetchType.JOIN)
    private Collection<SubItem2> subItem2;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
    @BatchFetch(value = BatchFetchType.JOIN)
    private Collection<SubItem3> subItem3;

    ... getters/setters 
}

如果我用 setFirstResult 和 setMaxResult 限制查询范围,例如

String qs = "select p from ItemX p"; 
Query qb = em.createQuery(qs);
qb.setFirstResult(0);
qb.setMaxResults(100);

这表明我只需要数据库中的前 100 个 ItemX 条目,记住每个 ItemX 都有几个集合。该查询确实将 ItemX 限制在 0 到 100 之间。但是,当 EntityManager 处理集合时,它会将每个集合的每个数据库行加载到内存中(在客户端上)。

有没有办法限制这种行为,以便批量查询只为每个需要的集合提取项目。或者要求数据库将结果查询留在服务器上并提供可滚动的结果窗口? (我试过可滚动的结果但没有帮助)。

目前我可以处理查询,但随着我们添加更多的集合和数据,查询将破坏 JVM(我真的不认为 64 位 JVM 是解决这个问题的答案)。

我们很乐意收到有关如何限制子集合查询大小的任何建议。

谢谢 丰富

最佳答案

如果你想将它与分页一起使用,你需要使用 IN 批量获取类型。

关于java - 如何限制 JPA Batch 查询的内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11154237/

相关文章:

mysql - 在jpa中运行sql脚本时sql语法错误

http - 如何使用从批处理脚本调用的 curl 获取 http post 请求的响应代码?

java - 如何使用外部公共(public) IP 从另一台计算机查看 GWT devmode

java - Spring 为有效 URL 生成 404

java - EclipseLink:默认情况下不获取某些字段

windows - 如果所有文件都超过 3 天,则批处理文件删除目录中的子文件夹

windows - 批处理,如何过滤此 HTML 文本以设置一些变量

java - 检索方法应该返回 'null' 还是在无法生成返回值时抛出异常?

java - 带 lambda 表达式的 PriorityQueue<Integer>

java - 当将 OrderColumn 与两个列表一起使用时,Hibernate 会抛出 "Repeated column in mapping for entity"