为啥要在缓存中获取 EclipseLink JPA query.getResultList() 结果的正确原因是啥?

Posted

技术标签:

【中文标题】为啥要在缓存中获取 EclipseLink JPA query.getResultList() 结果的正确原因是啥?【英文标题】:What is the correct why to get EclipseLink JPA query.getResultList() results in the cache?为什么要在缓存中获取 EclipseLink JPA query.getResultList() 结果的正确原因是什么? 【发布时间】:2013-08-12 17:51:51 【问题描述】:

当我使用 EclipseLink JPA query.getResultList() 时,它不会将结果存储在缓存中,因此当我调用 merge 时,第一个调用会执行全选然后更新每个对象。

在缓存中获取查询结果的正确方法是什么?

我正在考虑进行查询,然后为每个结果调用 EntityManager 查找 - 但似乎是错误的。显然我不能先调用 find 因为我不知道对象 ID。

基本上我想将所有数据缓存在内存中(在缓存中)并尽快更新。

谢谢

【问题讨论】:

【参考方案1】:

EclipseLink 默认将 getResultList() 返回的每个对象缓存在共享 (L2) 缓存中。

如果您没有获得缓存,则说明您配置错误。

请包括您的代码、配置和 SQL 日志。

你在使用 Spring 吗? (见http://www.eclipse.org/forums/index.php/t/200321/)

确保您没有禁用共享缓存或配置刷新。

你正在阅读多少个对象,从查询到合并需要多长时间?如果您正在读取大量对象,您可能需要增加缓存大小(默认为 100),或者更改缓存类型。

见,http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

【讨论】:

以上是关于为啥要在缓存中获取 EclipseLink JPA query.getResultList() 结果的正确原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

jpa 遇到问题,当被告知忽略时,看起来是从缓存中读取

JPA 2.0 如何处理死锁(Eclipselink JPA2.0 MySQL)

JPA Eclipselink子查询在where子句之间,CriteriaBuilder和元模型

从子句中的jpa eclipselink子查询

同一应用程序中的 JPA/Eclipselink 和 JDBC 连接

Eclipselink:如何在每个捆绑包中获取 EntityManager?