I have found that the JDBC replication API does not handle the keep alive messages sent by the server correctly.
A replication client cannot ignore even a single keep alive message from the server and it must respond to it.
LOG: terminating walsender process due to replication timeout
LOG: disconnection: session time: 0:02:00.173 user=replicant database=edb host=127.0.0.1 port=57900
and this is exactly what is happening when I use JDBC replication API.
The JDBC driver is ignoring the server's keep alive messages and hence the server stops the WAL sender and drops the connection.
Attached please find a sample program that I have mostly copied from the documentation available here
When we run this program and do not do any activity on the database server (I have tested with server version 12 and JDBC 42.2.14), after some time (wal_sender_timeout/2 seconds to be precise) the server stops the WAL sender process and drops the connection.
To use the program follow these steps:
Issue the following commands to the database server:
./createuser --superuser --replication -h 127.0.0.1 -p 7777 -U postgres replicant
select pg_drop_replication_slot('radium');
CREATE TABLE numbers(a int PRIMARY KEY, b varchar(255));
GRANT SELECT on numbers to replicant;
INSERT INTO numbers VALUES(10, 'ten'),(20,'twenty'),(30,'thirty');
CREATE PUBLICATION barium for TABLE numbers;
To run the program use the following commands:
mvn clean
mvn package
java -cp target/Lithium-1.0-SNAPSHOT.jar:/home/abbas/tmp/postgresql-42.2.14.jar com.edb.App
If my analysis is correct, can we please have this issue fixed in the driver?