我正在测试配置为JDBC Master / Slave的ActiveMQ系统的容错能力。在这个设置中有一个postgres数据库和两个代理 - 一个是主代理,另一个是从代理。这种机制的工作方式是master在db中的表上取出一个独占锁。从站也尝试执行此操作并等待锁定变为可用。如果主设备死机,则应释放锁定,从设备将接管。但是,如果主服务器与数据库失去网络连接,则永远不会释放锁定,从而导致死锁情况。这里似乎需要一种方法来告诉Postgres如果在指定的时间内没有更新,就会自动释放锁。 POSA 3设计模式书将其称为租赁模式。是否有可能让Postgres这样做?如果没有,其他数据库供应商是否支持它?
答案 0 :(得分:5)
这不是死锁,这是连接丢失的问题。
当两个事务试图锁定先前彼此锁定的资源时,会发生死锁。 PostgreSQL
检测到这些情况。
在您的情况下,master
锁定资源,slave
等待master
,master
等待由于连接丢失而从未收到的用户输入。
每当PostgreSQL
检测到丢失的连接时,它会自动回滚其事务。
要控制连接丢失检测,您可以使用以下PostgreSQL
connection options:
tcp_keepalives_idle (integer)
在支持
TCP_KEEPIDLE
套接字选项的系统上,指定在其他空闲连接上发送Keepalive之间的秒数。值为零使用系统默认值。如果不支持TCP_KEEPIDLE
,则此参数必须为零。对于通过Unix域套接字进行的连接,将忽略此参数。
tcp_keepalives_interval (integer)
在支持
TCP_KEEPINTVL
套接字选项的系统上,指定在重新传输之前等待keepalive响应的时间(以秒为单位)。值为零使用系统默认值。如果不支持TCP_KEEPINTVL
,则此参数必须为零。对于通过Unix域套接字进行的连接,将忽略此参数。
tcp_keepalives_count (integer)
在支持
TCP_KEEPCNT
套接字选项的系统上,指定在连接被视为死亡之前可能丢失的Keepalive数量。值为零使用系统默认值。如果不支持TCP_KEEPCNT
,则此参数必须为零。对于通过Unix域套接字进行的连接,将忽略此参数。