2009-07-22 10 views
1

Je suis en train de tester la tolérance de panne d'un système ActiveMQ configuré en maître/esclave JDBC. Dans cette configuration, il y a une base de données postgres et deux courtiers - l'un est le courtier maître, l'autre est un courtier d'esclaves. La façon dont ce mécanisme fonctionne est le maître prend un verrou exclusif sur une table dans le db. L'esclave essaie de le faire également et attend jusqu'à ce que le verrou devienne disponible. Si le maître meurt, le verrou doit être libéré et l'esclave prendra le relais. Toutefois, si le maître perd la connectivité réseau avec la base de données, le verrou n'est jamais libéré, ce qui entraîne un scénario de blocage. Ce qui semble nécessaire ici est un moyen de dire à Postgres de libérer automatiquement le verrou s'il n'est pas renouvelé dans un délai spécifié. Le livre de modèles de conception POSA 3 appelle cela le modèle de location. Est-il possible d'obtenir Postgres pour faire cela? Si non, les autres fournisseurs de bases de données le supportent-ils?Est-il possible de libérer automatiquement un verrou dans PostgreSQL?

Répondre

5

Ce n'est pas un interblocage, c'est un problème de connexion perdu. Un blocage se produit lorsque deux transactions tentent de verrouiller les ressources précédemment verrouillées l'une par l'autre. PostgreSQL détecte ces situations.

Dans votre cas, master verrouille une ressource, slave attend master et master attend l'entrée utilisateur qu'il reçoit jamais parce que la connexion est perdue. Lorsque PostgreSQL détecte une connexion perdue, il annule automatiquement sa transaction.

Pour contrôler la détection de perte de connexion, vous pouvez utiliser les éléments suivants PostgreSQLconnection options:

tcp_keepalives_idle (integer)

Sur les systèmes qui prennent en charge l'option prise TCP_KEEPIDLE, indique le nombre de secondes entre keepalives envoi sur un autre inactif connexion. La valeur zéro utilise la valeur par défaut du système. Si TCP_KEEPIDLE n'est pas pris en charge, ce paramètre doit être zéro. Ce paramètre est ignoré pour les connexions effectuées via un socket de domaine Unix.

tcp_keepalives_interval (integer)

Sur les systèmes qui prennent en charge l'option prise TCP_KEEPINTVL, indique combien de temps, en secondes, d'attendre une réponse à un keepalive avant retransmettant. La valeur zéro utilise la valeur par défaut du système. Si TCP_KEEPINTVL n'est pas supporté, ce paramètre doit être nul. Ce paramètre est ignoré pour les connexions effectuées via un socket de domaine Unix.

tcp_keepalives_count (integer)

Sur les systèmes qui prennent en charge l'option prise TCP_KEEPCNT, indique le nombre de keepalives peut être perdu avant que la connexion est considérée comme morte. La valeur zéro utilise la valeur par défaut du système. Si TCP_KEEPCNT n'est pas supporté, ce paramètre doit être zéro. Ce paramètre est ignoré pour les connexions effectuées via un socket de domaine Unix.

+0

C'est pourquoi j'adore stackoverflow – Andy

Questions connexes