gpt4 book ai didi

java - JDO查询返回不符合过滤条件的实体

转载 作者:行者123 更新时间:2023-12-02 10:38:36 25 4
gpt4 key购买 nike

我运行了以下 jdo 查询,其目的是获取具有空“流 id”的实体列表。但是,当我检查返回的列表时,它确实包含一个具有非空流 ID 的实体。

PersistenceManager pm = pmf.getPersistenceManagerProxy();    
String flowId = "";
Map<String, Object> params = new HashMap<>();
params.put("flowId", flowId);
List<MyEntity> entities = pm.newQuery(MyEntity.class, " this.flowId == :flowId ").setNamedParameters(params).executeList();

它并不总是发生,但当它发生时,我发现总是有另一个进程对该实体进行更新,以在相似的时间清除“流 ID”。但是,我从上述查询得到的结果具有该实体,但显示非空流 ID。我还检查了意外返回的实体的 JDO 对象状态,它是持久干净的。查询在 Activity 事务中运行。

这里是 JDOQLQuery 编译的 SQL。

SELECT 'com.example.MyEntity' AS "NUCLEUS_TYPE","A0"."CREATE_TIME","A0"."DATA_MAX_TIMESTAMP","A0"."DATA_MIN_TIMESTAMP","A0"."ID","A0"."OBSERVATION_ID","A0"."PARTITION_VALUE","A0"."PARTITION_CYCLE","A0"."PARTITION_TIMESTAMP","A0"."FLOW_ID","A0"."PROCESSING_STAGE","A0"."PROCESSING_STATUS","A0"."RECORD_COUNT","A0"."UPDATE_TIME" FROM "MY_ENTITIES" "A0" WHERE "A0"."FLOW_ID" = ?

虽然我认为这不相关,但隔离级别是读提交的,实体是可分离的,并且上面的查询正在事务中运行。请帮忙,谢谢!

更新

将隔离级别更改为可重复读取后,这种情况再也不会发生。所以很可能与隔离级别有关。我不确定是否有错误。我的数据核心版本是4.1.6。任何想法都会有帮助。

最佳答案

我关闭了一级和二级缓存。在某些罕见的情况下,datanucleus 中的缓存似乎不起作用,因为多个进程使用读提交隔离级别更新同一行。

当数据存储应用过滤条件时,它可以看到来自另一个进程的最新更新(在我的示例中将 flow_id 设置为空)。所以它返回该行。然而,当 datanucleus 使用行 id 查找其字段时,它首先检查缓存,但该实体的缓存中存在潜在的陈旧值,这似乎是此问题的根本原因。

关于java - JDO查询返回不符合过滤条件的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53096290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com