【问题标题】:JDO query returns entity that doesn't match the filter conditionJDO 查询返回与过滤条件不匹配的实体
【发布时间】:2018-11-01 06:37:40
【问题描述】:

我运行了以下 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 对象状态,它是持久干净的。查询在活动事务中运行。

这里是 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。任何想法都会有所帮助。

【问题讨论】:

  • 发布类,实际调用了什么SQL?
  • 添加了 sql。 @比利弗罗斯特
  • 并且只要传递的参数(您可以记录)是您所期望的,那么您就不会返回一些无效的对象。
  • 您可以做的另一件事是围绕它定义一个事务,这样您就可以看到 txn 何时启动,从而相对于其他任何正在更新的进程打开连接。
  • 这就是我问这个问题的原因,我记录了参数,它是一个空字符串。获得结果列表后,我立即检查是否存在任何具有非空 flow_id 的实体并且我得到了一个。这就是这个问题的全部内容,我正在寻找线索。查询已在活动事务中运行。 @比利弗罗斯特

标签: java jdo datanucleus


【解决方案1】:

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

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

【讨论】:

  • 如果您使用从不同 JVM 对数据库的并发访问,请尝试使用 datanucleus.cache.level2.type=none。
  • 感谢您的建议,一级缓存呢?似乎它们始终处于启用状态。 @engilyin
  • 不确定,但根据我的经验,如果您不知道自己在做什么,最好不要触摸 level1。但是,如果您在不同的 JVM 中使用 DB,则必须关闭二级缓存。否则,一个 JVM 实例将看不到另一个最近所做的更改。关闭二级缓存是否有助于解决您的问题?
  • 是的,我正在使用多个 JVM 可能会更新的数据库。我没有设置你提到的属性,但我确实将一个名为“datanucleus.cache.level2.mode”的类似属性设置为“none”。我问的是 1 级缓存,因为如果多个 JVM 存在问题,为什么 1 级缓存的存在无关紧要?当您说使用多个 JVM 时必须关闭 2 级缓存时,是否有任何文档可以参考? @engilyin
  • 阅读这里关于 DN 中的缓存管理:datanucleus.org/products/accessplatform_5_2/jdo/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多