2

我正在测试配置为 JDBC Master/Slave 的 ActiveMQ 系统的容错性。在这个设置中,有一个 postgres 数据库和两个代理——一个是主代理,另一个是从代理。这种机制的工作方式是master在db中的一个表上取出一个排他锁。从站也尝试这样做并等待直到锁可用。如果 master 死了,锁应该被释放,slave 将接管。但是,如果 master 失去与数据库的网络连接,则永远不会释放锁,从而导致死锁情况。这里似乎需要一种方法来告诉 Postgres 如果在指定的时间段内没有更新,则自动释放锁。POSA 3 设计模式书将其称为租赁模式。是否有可能让 Postgres 做到这一点?如果不,

4

1 回答 1

6

这不是死锁,这是失去连接的问题。

当两个事务试图锁定以前彼此锁定的资源时,就会发生死锁。PostgreSQL检测这些情况。

在您的情况下,master锁定资源,slave等待master,并master等待由于连接丢失而从未收到的用户输入。

每当PostgreSQL检测到丢失的连接时,它都会自动回滚其事务。

要控制连接丢失检测,您可以使用以下PostgreSQL 连接选项

tcp_keepalives_idle (integer)

在支持TCP_KEEPIDLE套接字选项的系统上,指定在其他空闲连接上发送保活之间的秒数。零值使用系统默认值。如果TCP_KEEPIDLE不支持,则此参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。

tcp_keepalives_interval (integer)

在支持TCP_KEEPINTVLsocket 选项的系统上,指定在重新传输之前等待对 keepalive 的响应的时间(以秒为单位)。零值使用系统默认值。如果TCP_KEEPINTVL不支持,则此参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。

tcp_keepalives_count (integer)

在支持TCP_KEEPCNTsocket 选项的系统上,指定在连接被认为死之前可能会丢失多少个 keepalive。零值使用系统默认值。如果TCP_KEEPCNT不支持,则此参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。

于 2009-07-22T21:47:52.767 回答