Обойти оптимистическую блокировку Jooq и DefaultRecordListener для некоторых методов

Я хотел бы синхронизировать таблицу с сервера A на B, запись должна быть точно такой же, как у источника. Это похоже на ручную репликацию.

Этот метод извлекается из исходной записи в виде json и вставляется/обновляется на целевой сервер, чтобы получить те же записи таблицы, включая поле версии.

У меня проблема с обновлением от источника к месту назначения, я обнаружил, что независимо от того, насколько поля идентичны, он будет обновлять дату изменения и поле версии.

Любое решение для принудительного обновления этих полей (версия или дата) без отключения параметра оптимистической блокировки и обхода настраиваемого класса «DefaultRecordListener»

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Начиная с jOOQ 3.11, невозможно обойти настройку версии записи или метки времени с помощью стандартной функции. Я создал запрос функции, чтобы реализовать это в jOOQ 3.12: https://github.com/jOOQ/jOOQ/issues/8924

Есть несколько обходных путей, все из которых предполагают, что вы уже отключили Settings.executeWithOptimisticLocking в своей логике копирования данных.

Обходной путь: использование RecordListener

Если вы используете версии записи (не метки времени), вы можете установить версию записи на version - 1 перед сохранением записи. Это приведет к тому, что версия будет снова обновлена ​​до того же значения. Хак, но может быть достаточно хорошим.

Обходной путь: повторно сгенерируйте таблицы для этой цели.

Вы можете повторно сгенерировать все таблицы, участвующие в этой операции, во второй раз без версий записей/временных меток и использовать эти альтернативные сгенерированные таблицы для копирования данных.

Обходной путь: не используйте UpdatableRecord

Вместо использования UpdatableRecord вы можете написать настоящие INSERT утверждения. Обратите внимание, что вы можете передать любой оператор Record в оператор INSERT с помощью метода InsertSetStep.set(Record). Это будет иметь тот же эффект, что и вызов record.insert(), то есть будут вставлены только измененные поля.

спасибо, я использую UpdateSetFirstStep (обновление) или InsertSetStep (вставка) для решения моей проблемы.

Adam Yong 10.07.2019 15:17

Другие вопросы по теме