Java 如果值为null,则OpenJpa查询缓存不会刷新
我在OpenJpa二级缓存中遇到了一些问题。大多数情况下,缓存都在工作,但在一种特定情况下,它不工作。这是一个不起作用的场景, 当您的代码结果为空值时,它会将其存储到缓存中,然后再也不会清除该值。尽管它仅在查询返回值时清除值 这是我为从数据库中获取值而编写的代码Java 如果值为null,则OpenJpa查询缓存不会刷新,java,spring,performance,hibernate,openjpa,Java,Spring,Performance,Hibernate,Openjpa,我在OpenJpa二级缓存中遇到了一些问题。大多数情况下,缓存都在工作,但在一种特定情况下,它不工作。这是一个不起作用的场景, 当您的代码结果为空值时,它会将其存储到缓存中,然后再也不会清除该值。尽管它仅在查询返回值时清除值 这是我为从数据库中获取值而编写的代码 List<PartnerapiworkflowEntity> partnerapiworkflowEntityList = null; try { partnerapiworkflow
List<PartnerapiworkflowEntity> partnerapiworkflowEntityList = null;
try {
partnerapiworkflowEntityList = entityManager.createQuery("select p from someentity p where p.id = :Id and p.name = :name and " +
"p.code = :Code and p.operationname = :operationName")
.setParameter("Id", Id)
.setParameter("name", name)
.setParameter("code", Code)
.setParameter("operationName", operationName).getResultList();//.getSingleResult();
if(partnerapiworkflowEntityList != null && partnerapiworkflowEntityList.size() > 0){
return Boolean.TRUE;
}
} catch (NoResultException ne) {
logger.severe("some logging info.");
}
finally {
// entityManager.detach(partnerapiworkflowEntity);
}
这是persistence.xml代码
<property name="openjpa.jdbc.DBDictionary" value="mysql"/>
<property name="openjpa.DataCache" value="true(EnableStatistics=true, CacheSize=10000, SoftReferenceSize=0, EvictionSchedule='+10')"/>
<property name="openjpa.QueryCache" value="true(EvictPolicy='timestamp')"/>
<!--<property name="openjpa.jdbc.QuerySQLCache" value="true(EnableStatistics=true)"/>-->
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>
<property name="openjpa.Instrumentation" value="jmx(Instrument='DataCache,QueryCache,QuerySQLCache')"/>
<property name="openjpa.MetaDataRepository" value="Preload=true"/>
<property name="openjpa.Log" value="SQL=Trace" />
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
当查询总是返回值时,一切正常。问题是当它返回空值时启动。然后第一次存储在缓存中,然后再也不会刷新
我正在使用OpenJpa2和Hibernate。您正在逐出条目,但是查询缓存呢?在正常情况下,查询用例会注意到逐出,因此结果无效。。。它可以解释为什么null在这里失败。你能确认一下吗 编辑:
表示没有查询缓存。我的错
其他试一试?您有一个带有参数的查询,您可以直接在数据库上执行它吗 这个问题是在
openjpa2.2.2
中首次发现的。在线查找发现主干上有一个与二级缓存相关的缺陷()
但这个问题在后来的文章中再次被发现
解决方案: 到目前为止还没有确定。但他们给出了一些绕过的解决方案
openjpa.QueryCache
属性设置为false:
<property name="openjpa.QueryCache" value="false"/>
openjpa.jdbc.QuerySQLCache
可以配置为
排除某些JPQL查询,如下所示
从公司c选择c
和从部门d选择d
查询缓存存储查询执行返回的对象ID。当您运行查询时,JPA会根据启动时使用的查询属性和参数组合一个键,并检查缓存的查询结果。如果找到一个,将查找缓存结果中的对象ID,并返回生成的支持持久性的对象。否则,将针对数据库启动查询,并将查询加载的对象ID放入缓存中。在完全遍历查询启动时返回的列表之前,不会缓存对象ID列表
二级缓存会增加应用程序的内存消耗,
因此,限制二级缓存的大小非常重要。有
集群中更新的对象也可能存在过时数据
环境将二级缓存配置为主要读取,很少读取
修改实体。对于频繁和频繁的情况,建议不要使用二级缓存
同时更新的实体
资源链接:
1)如何将OpenJPA与Hibernate结合使用?2) 您的查询不能返回
null
值,它可以返回空列表。3) 您如何知道null
值存储在缓存中且从未清除,您是如何检查缓存内容的?当您调用single方法时,它将返回noResultExcepyion,如果值为空,则返回noResultExcepyion。对于第三个问题,我修改了数据库中的值,以便它必须返回值。之后我清除了缓存。但它仍然返回相同的结果,而我希望从结果中得到一个值。这取决于您是否使用JPA2.0之前版本的OpenJPALIB。在JPA2.0之前,没有定义使用二级缓存的机制。因此,OpenJPA1.x提供了自己的API来执行此功能。如果是端口2.0>请尝试在退出后删除刷新。我不理解您的问题。当查询缓存返回空值时,我遇到了问题。这并不是刷新该值。除了一个返回空值的查询之外,所有其他缓存都无效。我必须使用查询缓存。因此,我无法在代码中设置此配置。当我清除缓存时,我想要的唯一东西应该是清除所有缓存。但您提供了配置条目。。。您能确认提供的persistence.xml
就是我们正在讨论的吗?我已经更新了配置条目。很抱歉犯了这个错误。我不想取消查询缓存,因为这是提高性能所必需的。在这种情况下,您可以遵循第5条或确保存在第3条中描述的相关数据@Awadhendra@No,你不能确定这一点。这些都是来自一些内置API的配置值。您无法控制这些值是否存在。@Awadhendra让您查看了第3条。那怎么办?
<property name="openjpa.QueryCache" value="false"/>
<property name="openjpa.QueryCache" value="false"/>
OpenJPAEntityManagerSPI.setQuerySQLCache(boolean)