2009-07-22 29 views
1

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

答えて

5

これはデッドロックではありませんが、これは接続の問題が失われています。

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

mastermasterためslave待ち、接続が失われたので、それが受けたことがないユーザー入力のためのmaster待ち、リソースをロックします。

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

接続損失の検出を制御するには、使用することができ、次のPostgreSQLconnection options

TCP_KEEPIDLEソケットオプションをサポートするシステムで

tcp_keepalives_idle (integer)

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

tcp_keepalives_interval (integer)

、再送信する前に、キープアライブへの応答を待つ、秒単位で、どのくらいの時間を指定します。 0の値はシステムのデフォルトを使用します。 TCP_KEEPINTVLがサポートされていない場合、このパラメータはゼロでなければなりません。このパラメータは、Unixドメインソケット経由での接続では無視されます。 TCP_KEEPCNTソケットオプションをサポートするシステムで

tcp_keepalives_count (integer)

、接続が切れたと考えられる前に失われる可能性がどのように多くのキープアライブを指定します。 0の値はシステムのデフォルトを使用します。 TCP_KEEPCNTがサポートされていない場合、このパラメータはゼロでなければなりません。このパラメータは、Unixドメインソケット経由での接続では無視されます。

+0

これが私がstackoverflowが好きな理由です – Andy

関連する問題