2

JDBC マスター/スレーブとして構成された ActiveMQ システムの耐障害性をテストしています。この設定では、1 つの postgres データベースと 2 つのブローカーがあります。1 つはマスター ブローカー、もう 1 つはスレーブ ブローカーです。このメカニズムが機能する方法は、マスターがデータベース内のテーブルで排他ロックを取得することです。スレーブもこれを試み、ロックが使用可能になるまで待機します。マスターが停止した場合、ロックは解放され、スレーブが引き継ぎます。ただし、マスターがデータベースとのネットワーク接続を失うと、ロックが解放されず、デッドロック シナリオが発生します。ここで必要と思われるのは、指定された期間内に更新されない場合、Postgres に自動的にロックを解放するように指示する方法です。デザインパターンの POSA 3 ブックでは、これをリースパターンと呼んでいます。Postgresにこれをさせることは可能ですか? そうでない場合は、

4

1 に答える 1

6

これはデッドロックではなく、接続が失われた問題です。

デッドロックは、2 つのトランザクションが以前に相互にロックしていたリソースをロックしようとすると発生します。PostgreSQLこれらの状況を検出します。

あなたの場合、masterリソースをロックし、slave待機しmastermaster接続が失われたために受信しないユーザー入力を待機します。

接続の切断が検出されるたびPostgreSQLに、トランザクションが自動的にロールバックされます。

接続損失の検出を制御するには、次のPostgreSQL 接続オプションを使用できます。

tcp_keepalives_idle (integer)

TCP_KEEPIDLEソケット オプションをサポートするシステムで、アイドル状態の接続でキープアライブを送信する間隔を秒数で指定します。ゼロの値は、システムのデフォルトを使用します。がサポートされていない場合TCP_KEEPIDLE、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケットを介して確立された接続では無視されます。

tcp_keepalives_interval (integer)

ソケット オプションをサポートするシステムで、TCP_KEEPINTVL再送信する前にキープアライブへの応答を待機する時間を秒単位で指定します。ゼロの値は、システムのデフォルトを使用します。がサポートされていない場合TCP_KEEPINTVL、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケットを介して確立された接続では無視されます。

tcp_keepalives_count (integer)

ソケット オプションをサポートするシステムでTCP_KEEPCNT、接続が切断されたと見なされる前に失われるキープアライブの数を指定します。ゼロの値は、システムのデフォルトを使用します。がサポートされていない場合TCP_KEEPCNT、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケットを介して確立された接続では無視されます。

于 2009-07-22T21:47:52.767 に答える