`pgoutput` не отправляет BEGIN/COMMIT для пустых транзакций в PostgreSQL 18 — LSN слота репликации не продвигаетсяJAVA

Программисты JAVA общаются здесь
Anonymous
`pgoutput` не отправляет BEGIN/COMMIT для пустых транзакций в PostgreSQL 18 — LSN слота репликации не продвигается

Сообщение Anonymous »

Проблема
После обновления PostgreSQL 17 до PostgreSQL 18 наш потребитель логической репликации перестает обновляться 

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

restart_lsn
[/b] в слоте репликации, когда рабочая нагрузка состоит в основном из пустых транзакций (транзакций, которые касаются только таблиц, не включенных в публикацию).
В PostgreSQL 17 это работает правильно. В PostgreSQL 18 

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

restart_lsn
[/b] остается замороженным и перемещается только после 3–4 выполнений или когда происходит реальное опубликованное изменение.
История
Мы используем специальный компонент Spring Boot, который считывает данные из слота логической репликации с помощью JDBC 

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

PGReplicationStream
[/b] API с 

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

pgoutput
[/b] плагин.
Компонент обнаруживает пустые транзакции, подсчитывая сообщения DML между 

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

TxBeginEvent
[/b] и 

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

TxCommitEvent. Когда txMsgsCnt == 0
[/b] при фиксации он сбрасывает LSN слота вперед.
Упрощенная логика:

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

private void handleTxCommit(TxCommitEvent event) {
if (txMsgsCnt == 0 && flushOnEmptyTransactions) {
doFlush(); // advance restart_lsn
}
}
Вызовы сброса:

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

stream.setAppliedLSN(lsn);
stream.setFlushedLSN(lsn);
stream.forceUpdateStatus();
Есть ли другой рекомендуемый подход к продвижению 

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

restart_lsn
 когда нет опубликованных изменений?[/b]
Среда Ранее мы использовали таблицу пульса (запись в неопубликованную таблицу для генерации пар BEGIN/COMMIT в потоке). При этом использовалась потоковая передача BEGIN/COMMIT PostgreSQL < 18 для всех транзакций независимо от членства в публикации. В PostgreSQL 18 это больше не работает.

Подробнее: https://stackoverflow.com/questions/799 ... tgresql-18

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