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

时间:2012-06-22 10:12:37

标签: java jpa batch-file eclipselink

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

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

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

@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就是这个问题的答案)。 / p>

很高兴收到有关如何限制子集合查询大小的任何建议。

由于 富

1 个答案:

答案 0 :(得分:0)

如果要将其与分页一起使用,则需要使用IN批量提取类型。