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
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 PostgreSQL
connection 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. SiTCP_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. SiTCP_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. SiTCP_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.
- 1. Le verrou exclusif PostgreSQL arrête l'application
- 2. Existe-t-il un moyen d'interroger automatiquement svn pour un verrou publié?
- 3. Différence entre verrou (verrou) et verrouillage (variable_qui_utilise_I_am_using)
- 4. Fichiers temp de postgreSQL?
- 5. Est-il possible de créer une table avec un nom de variable dans PostgreSQL?
- 6. Libérer un port TCP/IP?
- 7. Comment libérer d'éventuels verrous Row de Postgres?
- 8. est-il nécessaire de libérer un NSInteger dans iphone?
- 9. Comment libérer un tableau d'objets dans un destructeur Delphi 7?
- 10. Détection d'un verrou pessimiste dans VB6
- 11. Libérer plusieurs objets dans delphi
- 12. Déterminer par programme quel thread Java contient un verrou
- 13. Détermination du processus qui a un verrou sur un fichier
- 14. Comment insérer un fichier texte dans un champ dans PostgreSQL?
- 15. construire et libérer le paquet dans sharepoint
- 16. Connexion de socket PostgreSQL
- 17. allouer et libérer un char * en C++
- 18. Comment détecter et libérer automatiquement les DLL qui ont vraiment changé?
- 19. Dois-je libérer un IBOultet dans ma fonction dealloc?
- 20. Propriété statique et verrou Utilisation
- 21. lignes multiples Concaténer dans un tableau avec SQL sur PostgreSQL
- 22. condition de course dans le verrou commun sur le fichier?
- 23. Est-ce que le verrou (objlocker) permet de sécuriser l'application thread thread? Et les membres statiques sont-ils automatiquement sécurisés?
- 24. Comment puis-je libérer ou libérer la mémoire allouée à un fichier .wav?
- 25. Quand libérer l'objet NSUrlConnection
- 26. Comment libérer self (UIImageView) dans touchesEnded?
- 27. Libérer CGImage (CGImageRef)
- 28. Delphi: Est-il acceptable pour un formulaire de se libérer?
- 29. Fonction Time Travel dans postgresql
- 30. fonction de mise à jour dans PostgreSQL
C'est pourquoi j'adore stackoverflow – Andy