首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA2.1/ EclipseLink 2.5.2中查询集合参数的最大大小

问JPA2.1/ EclipseLink 2.5.2中查询集合参数的最大大小
EN

Stack Overflow用户
提问于 2014-10-09 08:56:36
回答 4查看 5.2K关注 0票数 2

JPA2.1/ EclipseLink 2.5.2中的查询集合参数是否有最大大小(如果这有关系的话,连接到MySQL5.6)?

例如,在以下代码中,ids的最大允许和/或推荐大小是多少,以确保性能并避免JPA / EclipseLink /mysql中的任何可能的错误或问题?

代码语言:javascript
复制
@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);
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-11 15:31:01

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

MySQL 5.6参考手册第12.3.2章比较功能和操作人员定义:

在列表中的值数量仅受封包值的限制。

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

JPA2.0规范(JSR-317),Experssions中的第4.6.9章没有提到任何限制,所以至少我们可以假设它是工具链中“最弱”的组件(应用程序容器、持久性提供者、底层数据库、JVM堆大小)。

正如@Chris注意到的,在Oracle中,每个语句的参数限制为1000个。EclipseLink的类似问题已经由詹姆斯 (TopLink/EclipseLink的前架构师)在他的博客上描述过。

在这次运行中,我注意到的第一件事是Oracle的每个语句的参数限制为1,000个。由于IN批取绑定了一个大数组,而且我正在读取5,000个对象,因此超出了这个限制,运行出现了数据库错误。BatchFetchPolicy in EclipseLink帐户和定义了包含an IN的最大ids数的大小。EclipseLink中的默认大小限制应该是500 (.)

和

EclipseLink定义了一个JPA查询提示"eclipselink.batch.size",允许设置__大小。所以我会把这个值设为500进行测试。这意味着要读取所有5,000个对象,in批取将需要执行每批获取的关系10个查询。

无论如何,我鼓励大家阅读整篇文章。

票数 5
EN

Stack Overflow用户

发布于 2014-10-09 09:36:01

“限制”是数据库中SQL中的任何限制。查看由您的JPA提供程序创建的SQL,然后查看您使用的RDBMS中该语法的限制。

票数 0
EN

Stack Overflow用户

发布于 2014-10-09 09:55:24

使用setMaxResults()方法。

例如,结果如下

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

只有最大结果

代码语言:javascript
复制
em.createQuery(...).setParameter(...).setMaxResults(5).getResultList();

输出

1,2,3,4,5

范围的使用

代码语言:javascript
复制
em.createQuery(...).setParameter(...).setFirstResult(3).setMaxResults(5).getResultList();

输出

4、5、6、7、8

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26274285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档