我正在开发一个使用test_decoding + jdbc驱动程序进行PG逻辑复制的Java应用程序。主要代码来自PG documentation。
delete_flg
上面的代码在大多数情况下都可以正常工作。
但是,当大型事务提交到Postgresql时,PGReplicationStream stream =
replConnection.getReplicationAPI()
.replicationStream()
.logical()
.withSlotName("demo_logical_slot")
.withSlotOption("include-xids", true)
.withSlotOption("skip-empty-xacts", true)
.withSlotOption("include-timestamp", "on")
.withStatusInterval(5, TimeUnit.SECONDS)
.start();
while (true) {
//non blocking receive message
ByteBuffer msg = stream.readPending();
if (msg == null) {
TimeUnit.MILLISECONDS.sleep(10L);
continue;
}
int offset = msg.arrayOffset();
byte[] source = msg.array();
int length = source.length - offset;
System.out.println(new String(source, offset, length));
//feedback
stream.setAppliedLSN(stream.getLastReceiveLSN());
stream.setFlushedLSN(stream.getLastReceiveLSN());
}
将引发OOM错误。
在我的情况下,我在一个事务中更新了432629行,而Java服务器(2个CPU + 4GB内存)抛出了OOM错误。
stream.readPending()
所以我的问题是除了增加Java服务器硬件之外,如何解决OOM错误。