Gibt es eine Möglichkeit, die Verbindung in pgAdmin aufrechtzuerhalten, ohne sie auf dem Server festzulegen?

12887
David

Ich verwende postgres.heroku.com, um meine Datenbanken zu hosten. Das heißt, ich habe keine Möglichkeit, die Servereinstellungen zu ändern. Daher hilft mir die Antwort auf diese Frage nicht. Heroku ist nicht bereit, ihre Einstellungen zu ändern (ich habe sie kontaktiert).

Ich frage mich, was der beste Weg wäre, PgAdmin III zu hacken, um die Verbindung am Leben zu erhalten. Ich denke an Dinge wie das Erstellen eines Autohotkey-Makros, um Benutzeroberflächenaktionen zu automatisieren, während sich PgAdmin im Hintergrund befindet, oder möglicherweise ein Netzwerktool zu verwenden, um das Senden von Netzwerknachrichten für PgAdmins zu erzwingen.

Ich habe auch ein Angebot von 500 $ für jemanden erhalten, um den Code von PgAmin III zu ändern. Der Entwickler von PgAdmin ändert den Code nicht, nur wegen Heroku.

Was soll ich machen? PgAdmin ist in vielerlei Hinsicht überlegen, es hat nur diesen Nachteil.

11
Zu Ihrer Information, Heroku ist nicht der einzige mit diesem Problem. Wir haben dieses Problem auf einer unter Azure gehosteten Linux-VM ausgeführt, und ich denke, das Problem liegt darin, dass der Dienstanbieter inaktive TCP-Verbindungen schließt. Es wäre sehr schön, wenn PgAdmin die Keep-Alive-Option verfügbar machen könnte Jonas Stawski vor 7 Jahren 0
Ich habe dieses Problem seit 2002 mit pgadmin! Sicherlich könnte pgadmin so programmiert werden, dass die Verbindung automatisch wiederhergestellt wird, wenn das Zeitlimit überschritten wird, anstatt dass Sie die App schließen, erneut öffnen und den gesamten Baum erneut öffnen. Matthew Lock vor 6 Jahren 1

1 Antwort auf die Frage

15
Craig Ringer

libpqDie zugrunde liegenden PostgreSQL - Client - Bibliothek, hat die keepalivesOption TCP Keep Alive zu aktivieren .

Es sieht so aus, als könnten Sie mit PgAdmin-III keine beliebigen Verbindungsparameter direkt angeben, aber es gibt eine Problemumgehung.

Wenn Sie die Verbindungskonfiguration in PgAdmin-III betrachten, wird die Option "Dienst" angezeigt. Dies bezieht sich auf die Verbindungsdienstdatei . Um es zu verwenden, erstellen Sie ein ~/.pg_service.confmit folgenden Inhalten:

[myherokudb] user=myusername keepalives=1 connect_timeout=20 keepalives_idle=10 

und bei Verbindung von PgAdmin-III myherokudbin das serviceFeld eingeben .

Dies führt dazu, dass PgAdmin-III die in der Servicedatei angegebenen Verbindungsparameter verwendet, einschließlich der Aktivierung von Keepalives.

(Wenn Sie sich unter Windows befinden, befindet sich die Servicedatei möglicherweise an einem anderen Ort. Weitere Informationen finden Sie in der Dokumentation.)

Es gibt keine Umgebungsvariable libpq, um Keepalives zu steuern. Sie können es also nicht so einstellen. Sie müssen eine Servicedatei verwenden.

Die Unterstützung zusätzlicher Verbindungsparameter für PgAdmin-III oder ein Kontrollkästchen in den Verbindungsoptionen zur Steuerung des Parameters keepalives sollte ziemlich trivial sein. Ich frage mich, ob Dave verstanden hat, was Sie von Ihrem Angebot zur Finanzierung der Arbeit forderten.


Update : Die Servicedatei wird an dem in der PGSYSCONFDIRUmgebungsvariablen angegebenen Ort gesucht . Wenn nicht festgelegt, wird standardmäßig ein plattformspezifischer Speicherort verwendet, der für Windows nicht ordnungsgemäß dokumentiert zu sein scheint. Ich werde einen Dokumentationspatch einreichen. Die Dokumentation für.pgpass zeigt den Pfad so %APPDATA%\postgresql\pgpass.conf, als ~/.pg_service.confsollte es sein, %APPDATA%\postgresql\pg_service.confaber es scheint nicht so zu sein.

In der Tat lautet der richtige Pfad:

%APPDATA%\postgresql\.pg_service.conf 

So:

  • Start> Ausführen
  • % APPDATA%
  • Erstellen Sie das Verzeichnis "postgresql", falls es nicht existiert
  • Erstellen Sie die Datei ".pg_service.conf" als Textdatei mit den oben angegebenen Inhalten (siehe Hinweis unten bezüglich Dateinamen).
  • Geben Sie in PgAdmin-III als Hostnamen "localhost" und im Feld "Service" den Dienstnamen ein.

Ich habe unter Windows getestet und festgestellt, dass Sie das hostFeld in PgAdmin-III unter Windows nicht leer lassen können. PgAdmin-III scheint jeden in der Servicedatei angegebenen Host mit den Angaben im Verbindungsdialogfeld zu überschreiben. Sie sollten also keinen hostSchlüssel in die Servicedatei aufnehmen. (Ich werde einen Fehler melden).

Die Option "Dateierweiterungen für bekannte Dateitypen ausblenden" ist in Windows deaktiviert, damit Sie sie nicht aus Versehen aufrufen .pg_service.conf.txt. Wenn Sie nicht sicher sind, ob der Name richtig ist oder nicht, überprüfen Sie die Spalte "Typ" in Windows Explorer in der Listenansicht. Es wird "Textdokument" gelesen, wenn es falsch benannt .pg_service.conf.txtwurde und CONF Filewenn es richtig benannt wurde .pg_service.conf. Wenn Sie Probleme beim Umbenennen haben, deaktivieren Sie die Option "Dateierweiterungen für bekannte Dateitypen ausblenden" oder verwenden Sie einen sinnvollen Texteditor wie notepad ++, mit dem Sie Dateien mit beliebigem Namen erstellen können.

Beachten Sie den führenden Punkt (Punkt) im Dateinamen. Ja, das ist anders als pgpass.conf, und ja, das ist nervig und grenzt an einen Fehler.

Vielen Dank dafür! Ich habe jetzt 45 Minuten damit verbracht, dies auf meinem Windows 7-Computer auszuprobieren. Die erste Sache ist, dass ich das "Host" -Feld nicht leer lassen kann. In diesem Dialogfeld wird die Schaltfläche "OK" deaktiviert. Ich habe versucht, "-" als Host zu verwenden, was mich zum zweiten Problem brachte. Ich weiß nicht, wo die Datei pg_service.conf abgelegt werden soll. Ich habe versucht, Trial and Error auszuführen, und es in allen mit PgAdmin III verbundenen Unterverzeichnissen sowie in C: \ Users \ pc \ AppData \ Roaming \ postgresql abgelegt. Ich habe immer den Fehler erhalten: "Definition des Dienstes" myherokudb "nicht gefunden. David vor 10 Jahren 0
Ich habe auch versucht, über pg_service.conf zu lesen, aber anscheinend finde ich nur Dokumentation, die sich auf sie bezieht, in einem serverseitigen Kontext. David vor 10 Jahren 1
Ich weiß nicht, wo Sie einen "serverseitigen Kontext" haben, da sich die Dokumentation, auf die ich verlinkt habe, auf den Client bezieht. Wenn Sie nicht annehmen, dass "Unix / Linux" "Server" bedeutet, was nicht der Fall ist. Da Sie ursprünglich nicht erwähnt hatten, unter welchem ​​Betriebssystem Sie sich befanden, könnte ich nicht genauer sein. Ich habe jetzt die Antwort mit Windows-spezifischen Informationen aktualisiert (und ehrlich gesagt, Sie waren verwirrt). Unter Windows scheint PgAdmin-III den in der Servicedatei angegebenen Host mit dem in der Benutzeroberfläche angegebenen zu überschreiben. Lassen Sie also "host" in der Servicedatei leer. Craig Ringer vor 10 Jahren 0
Vielen Dank für deine Hilfe! Ihre Lösung funktioniert einfach! Es war der führende Punkt im Dateinamen, der mich verwirrte. Ich dachte, es wäre eine Linux-Sache. Danke nochmal! David vor 10 Jahren 0
Eigentlich funktioniert diese Lösung doch nicht. Ich habe lange gebraucht, um zu dieser Schlussfolgerung zu kommen, weil ich dachte, dass dies meine Netzwerkinstabilität verursacht hat, aber die Verbindung läuft immer noch aus. Ich bin zuversichtlich, dass ich Ihrer Beschreibung gefolgt bin. Es könnte ein Fall sein, wenn Heroku etwas eingerichtet hat, um zu verhindern, dass Tausende von Verbindungen zu ihren kostenlosen Testservern mit Hunderten von freien Datenbanken bestehen. David vor 10 Jahren 2
`keepalives = 1` [sollte laut Dokumentation bereits der Standard sein] (https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-PARAMKEYWORDS), daher habe ich` connect_timeout = hinzugefügt 20` und `keepalives_idle = 10`. Es scheint nach einem Neustart von pgadmin zu funktionieren. mivk vor 7 Jahren 0
Funktioniert dies auf pgAdmin 4? Es gibt kein "service" -Feld in der Benutzeroberfläche. Soll ich beispielsweise "myherokudb" in das Namensfeld eingeben? Desmond Lee vor 7 Jahren 0