質問

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

役に立ちましたか?

解決

これはデッドロックではなく、接続喪失の問題です。

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

あなたの場合、 master リソースをロックし、 slave 待っています master, 、 そして master ユーザー入力を待ちますが、接続が失われたために受信されません。

いつでも 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 ドメイン ソケット経由で行われた接続では無視されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top