通过jdbc执行逻辑复制时,如何解决OOM错误?

时间:2019-04-25 08:32:14

标签: java postgresql jdbc database-replication

我正在开发一个使用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错误。

0 个答案:

没有答案