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

14

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

Ich frage mich, wie ich PgAdmin III am besten hacken könnte, um die Verbindung aufrechtzuerhalten. Ich denke an Dinge wie das Erstellen eines Autohotkey-Makros, um Benutzeroberflächenaktionen zu automatisieren, während sich PgAdmin im Hintergrund befindet, oder das Verwenden eines Netzwerk-Tools, um das Senden von Netzwerknachrichten im Namen von PgAdmins zu erzwingen.

Ich habe auch ein Angebot von 500 $ für jemanden erhalten, der zum Code von PgAmin III wechseln möchte. Der Entwickler von PgAdmin wird den Code nur wegen Heroku nicht ändern.

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

David
quelle
Zu Ihrer Information, Heroku ist nicht der einzige mit diesem Problem. Dieses Problem tritt auf einer Linux-VM auf, die auf Azure gehostet wird, und ich denke, das Problem besteht darin, dass der Dienstanbieter inaktive TCP-Verbindungen schließt. Es wäre sehr schön, wenn PgAdmin die Keep-Alive-Option aufdecken könnte
Jonas Stawski
1
Ich habe dieses Problem mit pgadmin seit 2002! Sicherlich könnte pgadmin so codiert werden, dass die Verbindung nach Ablauf der Zeit automatisch wiederhergestellt wird, anstatt dass Sie die App schließen, erneut öffnen und den gesamten Baum erneut öffnen.
Matthew Lock

Antworten:

18

libpqDie zugrunde liegende PostgreSQL-Clientbibliothek bietet die keepalivesOption, TCP-Keepalives zu aktivieren .

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

Wenn Sie sich die Verbindungskonfiguration in PgAdmin-III ansehen, sehen Sie eine "Dienst" -Option. Dies bezieht sich auf die Verbindungsdienstdatei . Um es zu verwenden, erstellen Sie ein ~/.pg_service.confmit Inhalten wie:

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

und wenn Sie eine Verbindung von PgAdmin-III herstellen, geben Sie myherokudbdas serviceFeld ein.

Dadurch verwendet PgAdmin-III die in der Servicedatei angegebenen Verbindungsparameter, einschließlich der Aktivierung von Keepalives.

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

Es gibt keine Umgebungsvariable libpqzur Steuerung von Keepalives. Sie können dies also nicht so einstellen. Sie müssen eine Servicedatei verwenden.

Das Hinzufügen von Unterstützung für zusätzliche Verbindungsparameter zu PgAdmin-III oder ein Kontrollkästchen in den Verbindungsoptionen zur Steuerung des Keepalives-Parameters sollte ziemlich trivial sein. Ich frage mich, ob Dave verstanden hat, worum Sie bei Ihrem Angebot zur Finanzierung der Arbeit gebeten haben.


Update : Die Servicedatei wird an dem in der PGSYSCONFDIRUmgebungsvariablen angegebenen Speicherort nachgeschlagen . Wenn nicht festgelegt, wird standardmäßig ein plattformspezifischer Speicherort verwendet, der für Windows nicht ordnungsgemäß dokumentiert zu sein scheint. Ich werde einen Dokumentations-Patch einreichen. Die Dokumentation für.pgpass zeigt seinen Weg so, als %APPDATA%\postgresql\pgpass.confob es so ~/.pg_service.confsein sollte %APPDATA%\postgresql\pg_service.conf... aber es scheint nicht so zu sein.

In der Tat ist der richtige Weg:

%APPDATA%\postgresql\.pg_service.conf

So:

  • Start-> Ausführen
  • % APPDATA%
  • Erstellen Sie das Verzeichnis "postgresql", falls es nicht vorhanden ist
  • Erstellen Sie die Datei ".pg_service.conf" als Textdatei mit dem oben angegebenen Inhalt (siehe Hinweis unten zur Benennung der Datei).
  • Geben Sie in PgAdmin-III "localhost" als Hostnamen und den Dienstnamen als Dienstfeld 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 im Verbindungsdialog angegebenen zu überschreiben. Sie sollten also keinen hostSchlüssel in die Servicedatei aufnehmen. (Ich werde einen Fehler melden).

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

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

Craig Ringer
quelle
Vielen Dank dafür! Ich habe jetzt 45 Minuten damit verbracht, dies auf meinem Windows 7-Computer zu versuchen. Das erste ist, dass ich das Feld "Host" 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 ich die Datei pg_service.conf ablegen soll. Ich habe versucht, Versuch und Irrtum zu machen, und habe es in alle Unterverzeichnisse im Zusammenhang mit PgAdmin III und auch in C: \ Users \ pc \ AppData \ Roaming \ postgresql gestellt. Ich habe immer den Fehler bekommen: "Definition des Dienstes" myherokudb "nicht gefunden.
David
1
Ich habe auch versucht, über pg_service.conf zu lesen, aber ich finde anscheinend nur Dokumentation, die darauf verweist, in einem serverseitigen Kontext.
David
Ich weiß nicht, woher Sie den "serverseitigen Kontext" haben, da sich die von mir verlinkte Dokumentation auf den Client bezieht. Es sei denn, Sie gehen davon aus, dass "Unix / Linux" "Server" bedeutet, was nicht der Fall ist. Da Sie sich ursprünglich nicht die Mühe gemacht haben zu erwähnen, auf welchem ​​Betriebssystem Sie sich befanden, könnte ich nicht genauer sein. Ich habe die Antwort jetzt mit Windows-spezifischen Informationen aktualisiert (und ehrlich gesagt ist es fair genug, dass Sie verwirrt waren). Unter Windows scheint PgAdmin-III den in der Servicedatei angegebenen Host mit dem in der Benutzeroberfläche angegebenen zu überschreiben. Lassen Sie ihn daher hostin der Servicedatei leer.
Craig Ringer
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 sei eine Linux-Sache. Danke nochmal!
David
2
Eigentlich funktioniert diese Lösung doch nicht. Es hat lange gedauert, bis ich zu diesem Schluss gekommen bin und dachte, dass dies meine Netzwerkinstabilität usw. verursacht hat, aber die Verbindung läuft tatsächlich immer noch ab. Ich bin zuversichtlich, dass ich Ihrer Beschreibung gefolgt bin. Es könnte ein Fall sein, in dem Heroku etwas eingerichtet hat, um zu vermeiden, dass Tausende von Verbindungen zu ihren kostenlosen Testservern bestehen, auf denen Hunderte von kostenlosen Datenbanken gehostet werden.
David