После обновления PostgreSQL 17 до PostgreSQL 18 наш потребитель логической репликации перестает обновляться
Код: Выделить всё
restart_lsnВ PostgreSQL 17 это работает правильно. В PostgreSQL 18
Код: Выделить всё
restart_lsnИстория
Мы используем специальный компонент Spring Boot, который считывает данные из слота логической репликации с помощью JDBC
Код: Выделить всё
PGReplicationStreamКод: Выделить всё
pgoutputКомпонент обнаруживает пустые транзакции, подсчитывая сообщения DML между
Код: Выделить всё
TxBeginEventКод: Выделить всё
TxCommitEvent. Когда txMsgsCnt == 0Упрощенная логика:
Код: Выделить всё
private void handleTxCommit(TxCommitEvent event) {
if (txMsgsCnt == 0 && flushOnEmptyTransactions) {
doFlush(); // advance restart_lsn
}
}
Код: Выделить всё
stream.setAppliedLSN(lsn);
stream.setFlushedLSN(lsn);
stream.forceUpdateStatus();
Код: Выделить всё
restart_lsnСреда
- PostgreSQL 18.2 (Debian 18.2-1.pgdg12+1)
- Драйвер PostgreSQL JDBC 42.7.x
- [/b] плагин,
Код: Выделить всё
pgoutput[/b]Код: Выделить всё
proto_version=4 - Java 17, Spring Boot 2.4.13
Подробнее: https://stackoverflow.com/questions/799 ... tgresql-18