Проблемы с синхронизацией последовательностей и нарушением дублирования ключей после перехода на версию 3.2.0.FinalJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблемы с синхронизацией последовательностей и нарушением дублирования ключей после перехода на версию 3.2.0.Final

Сообщение Anonymous »

Недавно я перенес сервис с Quarkus 2.7 на последнюю версию 3.2.0.Final. Процесс миграции прошел гладко, и проект успешно собирается. Однако я столкнулся с проблемой при попытке записи данных в базу данных PostgreSQL.
Изначально я столкнулся с ошибкой:

Код: Выделить всё

Caused by: org.postgresql.util.PSQLException: ERROR: relation "public.revinfo_seq" does not exist
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:166)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:118)
at io.agroal.pool.wrapper.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:78)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:
Чтобы решить эту проблему, я переименовал текущую последовательность с info_rev_seq в revinfo_seq, поскольку в Hibernate 6 внесены изменения в стратегию именования последовательностей https://jpa-buddy. com/blog/hibernate6-whats-new-and-why-its-important/
После исправления имени последовательности вышеуказанная проблема была решена. Однако через некоторое время я обнаружил еще одну проблему.
Я столкнулся со следующей ошибкой:

Код: Выделить всё

org.hibernate.exception.ConstraintViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "pk_revinfo"
Detail: Key (rev)=(60) already exists.] [insert into public.REVINFO (REVTSTMP,REV) values (?,?)]
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:95)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:278)
at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.performNonBatchedMutation(AbstractMutationExecutor.java:108)
at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:40)
at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:53)
at org.hibernate.persister.entity.mutation.InsertCoordinator.doStaticInserts(InsertCoordinator.java:170)
at org.hibernate.persister.entity.mutation.InsertCoordinator.coordinateInsert(InsertCoordinator.java:112)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2761)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:102)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:606)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:358)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
...
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_revinfo"
Detail: Key (rev)=(60) already exists.
Структура таблицы revinfo следующая:

Код: Выделить всё

create table revinfo
(
rev      bigserial,
revtstmp bigint
);

alter table revinfo
add constraint pk_revinfo
primary key (rev);
В ходе расследования стало очевидно, что последовательность рассинхронизировалась. Например, таблица revinfo содержала 54 строки, но последовательность имела значение 23. Я вручную исправил последовательность, чтобы она соответствовала правильному значению, но в конечном итоге она снова не синхронизировалась.
Похоже, проблема связана с синхронизацией последовательности. Хотя конкретная причина еще не определена, проблеме могут способствовать такие факторы, как откат транзакций, параллельные операции или неправильное управление последовательностями.
Я подозреваю, что переход на Quarkus 3.2. 0.Final мог повлиять на поведение, поскольку до миграции синхронизация последовательностей работала правильно.
Я также использую Hibernate Envers для аудита своих таблиц, включая revinfo< /код> таблица. Однако, поскольку проблема возникает даже без какой-либо ссылки на таблицу revinfo в моих основных таблицах, похоже, что проблема заключается в синхронизации последовательностей, а не в самом аудите.
Кто-нибудь сталкивался с подобной проблемой и мог бы дать совет по ее решению и выявлению ее основной причины?
Ваши идеи и предложения будут очень признательны при решении упомянутой выше проблемы синхронизации последовательностей.
Пожалуйста, не стесняйтесь поделиться любым опытом или рекомендациями, которые могут помочь в устранение неполадок и эффективное решение проблемы.
Заранее благодарим за помощь
P.S. Используемая база данных — PostgreSQL

Подробнее здесь: https://stackoverflow.com/questions/767 ... -migration
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»