2010-07-30 9 views
0

J'ai demandé: How to break connections TCP/IP by keepalive postgreSQL without changing anything in the register?Existe-t-il un moyen de rompre les connexions perdues ou inactives TCP/IP dans PostgreSQL 8.4 dans un Windows Server 2008?

Et maintenant, je veux confirmer:

Mon système (C# .NET, NHibernate et Active Record) est en cours d'exécution avec une base de données PostgreSQL 8.4 et Windows Server. J'ai besoin d'un moyen de briser les connexions TCP/IP inactives ou perdues et de débloquer les données.

Je ne peux pas modifier les configurations du système d'exploitation ni recompiler PostgreSQL. Mon système peut fonctionner dans Oracle 10g Express si nécessaire! Je dois savoir: Puis-je interrompre les conections inutilisées sans implémenter un nouveau patch pour PostgreSQL? Ai-je besoin de pour migrer ma base de données vers Oracle pour cela?

Merci,

Répondre

1

S'il y a un moyen de forcer chaque nouvelle connexion pour exécuter une requête au moment de la connexion, vous pouvez écrire une fonction de base de données qui appelle dynamiquement « pg_terminate_backend (pid) » pour tous les processus qui sont dans certains critères . Sans connaître votre configuration, certaines possibilités sont les suivantes: - (? 1 minute 5 minutes)

  • Connexions avec current_query = 'dans la transaction' et CURRENT_TIMESTAMP query_start() supérieure à une valeur
  • connexions à partir de votre adresse IP ou nom d'utilisateur individuel (s'il existe) que vous n'utilisez pas actuellement (probablement pas une bonne idée dans les environnements de mise en commun de connexion, cependant)

Personnellement, j'essayerais de refactoriser afin de minimiser le temps La transaction peut éventuellement être ouverte. Certains endroits où vous pouvez avoir une transaction ouverte inutilement, ce qui augmente le risque de déclencher votre problème:

  • Un ORM est en cours d'exécution lorsque AutoCommit est désactivé.
  • Une VERROUILLAGE est prise lorsque des données sont lues pour un écran d'édition, de sorte que les données ne peuvent pas être mises à jour avant d'être réécrites. Il peut être acceptable de vérifier avant d'écrire qu'il n'y a pas de conflit.
  • Les transactions démarrées avant une tâche autre que la base de données, comme un processus FTP ou Email, ont ensuite été fermées.
  • Transactions où la toute première instruction est un SELECT sans clause de verrouillage (comme "FOR UPDATE"). Le résultat de ce SELECT sera le même que ce soit à l'intérieur ou à l'extérieur de la transaction, c'est donc un indicateur que la transaction a été démarrée trop tôt et pourrait être raccourcie.
  • Transactions qui contiennent uniquement une instruction de n'importe quel type.
+0

Merci! J'ai aimé ta réponse aussi! – KaH600

+0

Salut, Matthew? Merci, mec! Êtes-vous du Texas? -Agréable! ;) – KaH600