Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果值为null,则OpenJpa查询缓存不会刷新_Java_Spring_Performance_Hibernate_Openjpa - Fatal编程技术网

Java 如果值为null,则OpenJpa查询缓存不会刷新

Java 如果值为null,则OpenJpa查询缓存不会刷新,java,spring,performance,hibernate,openjpa,Java,Spring,Performance,Hibernate,Openjpa,我在OpenJpa二级缓存中遇到了一些问题。大多数情况下,缓存都在工作,但在一种特定情况下,它不工作。这是一个不起作用的场景, 当您的代码结果为空值时,它会将其存储到缓存中,然后再也不会清除该值。尽管它仅在查询返回值时清除值 这是我为从数据库中获取值而编写的代码 List<PartnerapiworkflowEntity> partnerapiworkflowEntityList = null; try { partnerapiworkflow

我在OpenJpa二级缓存中遇到了一些问题。大多数情况下,缓存都在工作,但在一种特定情况下,它不工作。这是一个不起作用的场景, 当您的代码结果为空值时,它会将其存储到缓存中,然后再也不会清除该值。尽管它仅在查询返回值时清除值

这是我为从数据库中获取值而编写的代码

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查询,如下所示

  • 永远不会缓存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)