Запрос JDO возвращает объект, который не соответствует условию фильтра - PullRequest
0 голосов
/ 01 ноября 2018

Я выполнил следующий jdo-запрос, он предназначен для получения списка сущностей с пустым «идентификатором потока». Однако, когда я проверяю возвращенный список, он содержит сущность с непустым идентификатором потока.

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();

Это не всегда происходит, но когда это происходит, я обнаружил, что всегда есть обновление для этого объекта из другого процесса, чтобы очистить «идентификатор потока» в то же время. Тем не менее, результат, который я получил из вышеупомянутого запроса, имеет эту сущность, но показывает непустой идентификатор потока. Я также проверил состояние объекта JDO неожиданно возвращенного объекта, он постоянно чист. Запрос выполняется в активной транзакции.

Вот SQL, скомпилированный JDOQLQuery.

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. Любые мысли помогут.

1 Ответ

0 голосов
/ 07 ноября 2018

Я отключаю кеш уровня 1 и уровня 2. Кажется, что кэширование в datanucleus не работает в некоторых редких случаях, когда несколько процессов обновляют одну и ту же строку с уровнем изоляции, зафиксированным для чтения.

Когда хранилище данных применяет условие фильтрации, оно может видеть последнее обновление от другого процесса (в моем примере установите значение flow_id пустым). Таким образом, он возвращает эту строку. Однако, когда datanucleus ищет свое поле, используя идентификатор строки, он сначала проверяет кеш, но в этой сущности есть потенциальное устаревшее значение для кеша, которое, по-видимому, является основной причиной этой проблемы.

...