JPA2.1/ EclipseLink 2.5.2中的查询集合参数是否有最大大小(如果这有关系的话,连接到MySQL5.6)?
例如,在以下代码中,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);
}发布于 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个查询。
无论如何,我鼓励大家阅读整篇文章。
发布于 2014-10-09 09:36:01
“限制”是数据库中SQL中的任何限制。查看由您的JPA提供程序创建的SQL,然后查看您使用的RDBMS中该语法的限制。
发布于 2014-10-09 09:55:24
使用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
https://stackoverflow.com/questions/26274285
复制相似问题