2014-10-09 74 views
1

JPA 2.1/EclipseLink 2.5.2中的查询集合参数的最大大小(如果有问题,连接到mysql 5.6)?JPA 2.1/EclipseLink中查询集合参数的最大大小2.5.2

例如,什么是最大允许和/或推荐大小ids在下面的代码,以确保性能和避免JPA/EclipseLink的/ MySQL的?:

@PersistenceContext 
private EntityManager em; 

{ 
    final Collection<Long> ids = /*obtain a Collection of IDs*/; 

    em.createQuery("select e from Entity1 e where e.id in :ids") 
     .setParameter("ids", ids); 
} 
+0

我读过Oracle中的限制是1000个参数,但我没有看到Mysql的限制。您将必须测试数据库以查看更高的值如何影响性能。 – Chris 2014-10-09 12:48:17

回答

3

有没有简单明了的回答你的问题,因为它取决于多种因素,如JVM的进程堆的大小,持久性提供专有功能,底层数据库调优选项等等。在现实生活中,所有这些因素都应该单独进行调整。


的MySQL 5.6参考手册,章节12.3.2 比较函数和操作定义:

值在IN列表的数目仅由 max_allowed_packet限于值。

由于max_allowed_pa​​cket等于一个数据包或任何生成/中间字符串(此处为1GB)的最大大小,理论上应允许发送最大大小为1GB的查询字符串。


JPA 2.0规范(JSR-317),章4.6.9在Experssions没有提及限制任何事情,所以至少我们可以认为它是“最弱”组件的问题在工具链中(应用程序容器,持久性提供程序,底层数据库,JVM堆大小)。


正如@Chris所注意的那样,Oracle在每条语句中限制为1000个参数。与EclipseLink的类似的问题已经在描述由James(TopLink的/的EclipseLink的原建筑师)他blog

,我在此运行注意到的第一件事是,Oracle有一个限制每条语句1000 参数。由于IN批次读取绑定了一个大型数组,并且我正在读取5,000个对象,所以此限制超出了 ,并且运行随着数据库错误而爆发。 BatchFetchPolicy在 的EclipseLink占此和限定大小的 ID的最大数量以包括一个IN。在EclipseLink的默认大小限制 假设是500(...)

的EclipseLink定义JPA查询提示 “eclipselink.batch.size”允许尺寸将被设置为所以我会设置为500测试。 这意味着要读取所有5,000个对象,批处理批次 需要为每个批次获取的关系执行10个查询。

我鼓励读完整篇文章。

+0

感谢您的详细信息。看起来'BatchFetchPolicy#size'仅用于使用'BatchFetchType.IN'批量获取实体关系。 EclipseLink 2.5.2可以配置为对用作查询值参数的集合进行分区吗?例如,如果我将EclipseLink配置为分割为500个元素块,并且如果传入10,000个“Collection”作为查询参数值,那么当我在查询上调用getResultList()时,我希望EclipseLink运行查询20每次运行500个元素,然后将结果连接成一个返回的'List'。 – XDR 2014-10-12 10:15:49

+0

你所描述的场景提醒了一个典型的“分页”。我担心JPA/EclipseLink不会在内部支持这种功能,而是通过为'setMaxResults'和'setFirstResult'方法提供'Query'接口来委托它。从更一般的角度来看它 - 这个问题是特定于特定环境的,因此EclipseLink或MySQL无法找出所有查询以最高性能方式工作的完美界限。通常默认设置可以满足大多数环境,最终可以调整。 – wypieprz 2014-10-12 18:46:14

0

的任何可能的错误或问题“限制”是SQL在数据库中的限制。查看您的JPA提供商创建的SQL,然后查看您使用的RDBMS中的语法限制。

0

使用setMaxResults()方法。

对于实施例结果如下

1,2,3,4,5,6,7,8,9,10

只有最大结果

em.createQuery(...).setParameter(...).setMaxResults(5).getResultList(); 

输出

1,2,3,4,5

范围的使用

em.createQuery(...).setParameter(...).setFirstResult(3).setMaxResults(5).getResultList(); 

输出

4,5,6,7,8

+0

这不是我要找的。我不需要限制JPA查询的输出。我需要知道我可以安全地将多少项作为单个输入集合参数的成员传递给查询。 – XDR 2014-10-09 17:14:55